Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: регулярное выражение для слов через запятую
 
 автор: kzone   (13.04.2007 в 17:29)   письмо автору
 
 

Здравствуйте, уважаемый коллектив SoftTime и форумчане! :)
Пишу здесь впервые :) раньше только читал :)
Регулярные выражения даются пока с трудом, но кое-как я все же их составлял :) Но вот новая проблема все-таки заставила меня создать эту тему.
Итак, переменная $text имеет значение равное строке с набором слов, помещенных через запятую:
$text="Nokia6630,смартфоны,загрузки,контент";

Причем количество слов может меняться.
Необходимо написать регулярное выражение, которое:
а) удовлетворяло бы такому написанию слов и запятых;
б) не пропускало написание двух слов между запятыми, прочие знаки и символы (пробелы до-после запятой, перед первым словом и в конце последнего, запрет на окончание-начало строки с запятой и т.д.);
Я начал писать РВ следующим образом:
$pattern="/[0-9a-zа-я][^\s],[^\s][0-9a-zа-я]/i";

Но такое выражение проверяет только первые два слова и ориентируется только на них, остальные же могут содержать пробелы и прочее.
Помогите, пожалуйста, грамматно написать регулярное выражение.
Пока писал все это, подумал, что для пробелов можно использовать trim-функции :)
Заранее спасибо!

   
 
 автор: Trianon   (13.04.2007 в 17:48)   письмо автору
 
   для: kzone   (13.04.2007 в 17:29)
 

$pattern="/^([0-9a-zа-я]+)([,][0-9a-zа-я]+)*$/i";

   
 
 автор: kzone   (13.04.2007 в 18:06)   письмо автору
 
   для: Trianon   (13.04.2007 в 17:48)
 

Спасибо...
Но это выражение не работает...

   
 
 автор: kzone   (13.04.2007 в 18:31)   письмо автору
 
   для: kzone   (13.04.2007 в 18:06)
 

Большое спасибо!!!!
Сделал так:
$pattern="/^([0-9a-zа-я][^\s]+)([,][^\s][0-9a-zа-я]+)*$/i";
И работает :)

   
 
 автор: kzone   (13.04.2007 в 18:56)   письмо автору
 
   для: kzone   (13.04.2007 в 18:31)
 

Хм... Все хорошо, но выражение допускает написание запятой в конце строки, что мне не нужно...
Как это можно исправить?

   
 
 автор: Trianon   (13.04.2007 в 19:18)   письмо автору
 
   для: kzone   (13.04.2007 в 18:56)
 

предложенное мной - не допускало.

   
 
 автор: kzone   (13.04.2007 в 19:37)   письмо автору
 
   для: Trianon   (13.04.2007 в 19:18)
 

Trianon, а вы сами пробовали проверить таким (вами предложеным) выражением? Оно не то, что запятую в конце не допускает, она даже на верную строку пишет не "соответствие". :)
Второй же вариант не допускает написание пробелов в любой части строки (перед-после запятой, в начале-конце строки), а также запятую в начале строки. Но! Разрешает писать запятую в конце и две подряд, что мне не нужно :)
Вот тут я опять застрял :)

   
 
 автор: Trianon   (13.04.2007 в 20:11)   письмо автору
 
   для: kzone   (13.04.2007 в 19:37)
 

> Trianon, а вы сами пробовали проверить таким (вами предложеным) выражением?


<?
 $pattern
="/^([0-9a-zа-я]+)([,][0-9a-zа-я]+)*$/i";
$text="Nokia6630,смартфоны,загрузки,контент,";
echo 
preg_match($pattern$text);
?>
выводит 0 



<?
 $pattern
="/^([0-9a-zа-я]+)([,][0-9a-zа-я]+)*$/i";
$text="Nokia6630,смартфоны,загрузки,контент";
echo 
preg_match($pattern$text);
?>
выводит 1 



<?
 $pattern
="/^([0-9a-zа-я]+)([,][0-9a-zа-я]+)*$/i";
$text="Nokia6630";
echo 
preg_match($pattern$text);
?>
выводит 1 


Где не работает?

   
 
 автор: kzone   (13.04.2007 в 20:29)   письмо автору
 
   для: Trianon   (13.04.2007 в 20:11)
 

Или у меня какой-то не такой php или у вас чего-то не так :)
при:
$pattern="Nokia6630";
выводит: 1
при:
$pattern="Nokia6630,смартфоны, загрузки,контент";
выводит: 0
при:
$pattern="Nokia6630,смартфоны, загрузки,контент,";
выводит: 0
:) и как это можно объяснить? :)
РВ переписал символ в символ, так что син.ошибку исключаем...

   
 
 автор: Trianon   (13.04.2007 в 20:47)   письмо автору
 
   для: kzone   (13.04.2007 в 20:29)
 

Локаль стоит неправильная, например.
Уберите модификатор i и добавьте диапазоны заглавных букв. Как вариант.

У меня всё ОК - don't worry!
. Как минимум в плане регекспов. :)

   
 
 автор: kzone   (13.04.2007 в 21:49)   письмо автору
 
   для: Trianon   (13.04.2007 в 20:47)
 

Спасибо! :) попробую.

   
 
 автор: kzone   (17.04.2007 в 20:22)   письмо автору
 
   для: Trianon   (13.04.2007 в 20:47)
 

>Локаль стоит неправильная, например.
Попробовал поставить локаль:
setlocale (LC_CTYPE, 'ru_RU.UTF-8');
убрал модификатор i, проставил диапазоны букв в верхнем регистре и... Ничего :(
все по-прежнему...
Что еще может быть причиной?

   
 
 автор: Trianon   (17.04.2007 в 20:32)   письмо автору
 
   для: kzone   (17.04.2007 в 20:22)
 

utf-кодировка - многобайтовая кодировка с переменным размером символа.
Честно скажу - умеет ли работать preg-движок с utf-локалью - для меня самого загадка.
Если есть знающие товарищи, сам бы с удовольствием их послушал.

   
 
 автор: kzone   (17.04.2007 в 20:37)   письмо автору
 
   для: Trianon   (17.04.2007 в 20:32)
 

>Честно скажу - умеет ли работать preg-движок с utf-локалью - для меня самого загадка.
что же, будем ждать :) может кто-нибудь и просветит. :)

   
 
 автор: Саня   (17.04.2007 в 20:54)   письмо автору
 
   для: kzone   (17.04.2007 в 20:37)
 

Существует модификатор "/u", позволяющий регулярным выражениям обрабатывать строки как UTF8.

   
 
 автор: kzone   (18.04.2007 в 20:44)   письмо автору
 
   для: Саня   (17.04.2007 в 20:54)
 

Всем огромное спасибо!!!!
Все прекрасно работает с этим волшебным модификатором /u :) !!!! Спасибо Саня!
Trianon, ваше РВ работает на 5 :) Большое вам спасибо! Знайте теперь, что для работы с utf-8 нужно использовать этот замечательный модификатор и без локалей :)

   
 
 автор: Trianon   (13.04.2007 в 19:27)   письмо автору
 
   для: kzone   (13.04.2007 в 18:06)
 

Работает. Как минимум на Вашем примере.

   
 
 автор: kzone   (13.04.2007 в 19:53)   письмо автору
 
   для: Trianon   (13.04.2007 в 19:27)
 

у меня - нет :)

   
 
 автор: bronenos   (16.04.2007 в 18:36)   письмо автору
 
   для: kzone   (13.04.2007 в 19:53)
 

$text = explode (',', $text);
и проверяйте элементы по очереди :)

   
 
 автор: kzone   (16.04.2007 в 20:58)   письмо автору
 
   для: bronenos   (16.04.2007 в 18:36)
 

:) спасибо, конечно, но хочется регулярными выражениями :)
вот руки до компьютера дойдут и сделаю все что надо :)

   
 
 автор: Unkind   (16.04.2007 в 20:41)   письмо автору
 
   для: kzone   (13.04.2007 в 19:53)
 

kzone, текст в UTF-8 небось?

   
 
 автор: kzone   (16.04.2007 в 21:03)   письмо автору
 
   для: Unkind   (16.04.2007 в 20:41)
 

ну, а в чем же еще? :)))
а что? Это как-то влияет?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования