Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Помогите разобраться в регулярке для выборки 3х-символьных слов из строки
Форумы портала PHP.SU » PHP » Регулярные выражения » Помогите разобраться в регулярке для выборки 3х-символьных слов из строки

Страниц (1): [1]
 

1. xodos - 25 Сентября, 2014 - 12:25:54 - перейти к сообщению
Здравствуйте. Пожалуйста, помогите с регуляркой:

для выборки из строки 3х-символьных слов в массив.

Имеется, предположим $string = "Сыр масло суп картофель";
Нужен на выходе массив $matches[0] = "Сыр", $matches[1] = "суп"

Непонимаю, как описать в регулярке, что до трех символов и после может быть не только пробел но это может быть начало или конец строки а может и не быть...

пробовал чтото типа:
PHP:
скопировать код в буфер обмена
  1. $string = "Сыр масло суп картофель";
  2. preg_match_all("/[^А-ЯЁ][А-ЯЁ]{3}[^А-ЯЁ]+/ui",$string,$matches);


Не работает...
2. OrmaJever - 25 Сентября, 2014 - 12:40:10 - перейти к сообщению
символ ^ в квадратных скобках это отрицание, то есть ищет всё кроме диапазона А-Я и Ё. Уберите этот символ.
3. xodos - 25 Сентября, 2014 - 12:43:00 - перейти к сообщению
OrmaJever пишет:
символ ^ в квадратных скобках это отрицание, то есть ищет всё кроме диапазона А-Я и Ё. Уберите этот символ.


Так я так и хотел, т.е. если идет не буквенный симвл, затем три буквы, затем опять не буквенный симвл, но он не реагирует если слово в начале или в конце строки.
4. IllusionMH - 25 Сентября, 2014 - 21:15:40 - перейти к сообщению
xodos, нужно добавить группу сравнений с концом или началом строки.
PHP:
скопировать код в буфер обмена
  1. preg_match_all("/(?:^|[^А-ЯЁ])[А-ЯЁ]{3}(?:[^А-ЯЁ]|$)/ui",$string,$matches);

Но придется еще trim, т.к. эта регулярка подхватывает и пробелы.
Как вариант, можно попробовать челер lookaround. Вроде так
PHP:
скопировать код в буфер обмена
  1. preg_match_all("/(?<=^|[^А-ЯЁ])[А-ЯЁ]{3}(?=[^А-ЯЁ]|$)/ui",$string,$matches);
5. xodos - 25 Сентября, 2014 - 21:51:11 - перейти к сообщению
IllusionMH пишет:
xodos, нужно добавить группу сравнений с концом или началом строки.
PHP:
скопировать код в буфер обмена
  1. preg_match_all("/(?:^|[^А-ЯЁ])[А-ЯЁ]{3}(?:[^А-ЯЁ]|$)/ui",$string,$matches);

Но придется еще trim, т.к. эта регулярка подхватывает и пробелы.
Как вариант, можно попробовать челер lookaround. Вроде так
PHP:
скопировать код в буфер обмена
  1. preg_match_all("/(?<=^|[^А-ЯЁ])[А-ЯЁ]{3}(?=[^А-ЯЁ]|$)/ui",$string,$matches);


Спасибо, сработало, хотел уже радоваться но заметил что он не хватает рядом идущие слова,, сжирая пробелы регулярка ищет дальше, и пробелов больше не находит т.к. забрала их из соседнего слова.

UPD
решил проблему без регулярки, сделал explode строки по пробелу, и из получившегося массива вытащил те у которых str lenght == 3
Регуляркой лишь предварительно очистил на всякий от запятых точек и прочего...
6. dcc0 - 25 Сентября, 2014 - 22:17:34 - перейти к сообщению
Никто не запрещает делать два прохода по одной строке:
PHP:
скопировать код в буфер обмена
  1.  
  2. $string = "Сыр масло лук суп";
  3. preg_match_all("!^[А-Яёа-яё]{3}|[А-Яёа-яё]{3}$!ui", $string, $matches);
  4. preg_match_all("! [А-Яёа-яё]{3} !ui", $string, $matches2);  
  5.  
  6.  

К тому же можно найти способ вставить пробел в начало и конце строки, тогда выражение сократиться сильно.

 

Powered by ExBB FM 1.0 RC1