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

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

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
xodos
Отправлено: 25 Сентября, 2014 - 12:25:54
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




Здравствуйте. Пожалуйста, помогите с регуляркой:

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

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

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

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


Не работает...
 
 Top
OrmaJever
Отправлено: 25 Сентября, 2014 - 12:40:10
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




символ ^ в квадратных скобках это отрицание, то есть ищет всё кроме диапазона А-Я и Ё. Уберите этот символ.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
xodos
Отправлено: 25 Сентября, 2014 - 12:43:00
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




OrmaJever пишет:
символ ^ в квадратных скобках это отрицание, то есть ищет всё кроме диапазона А-Я и Ё. Уберите этот символ.


Так я так и хотел, т.е. если идет не буквенный симвл, затем три буквы, затем опять не буквенный симвл, но он не реагирует если слово в начале или в конце строки.
 
 Top
IllusionMH
Отправлено: 25 Сентября, 2014 - 21:15:40
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




xodos, нужно добавить группу сравнений с концом или началом строки.
PHP:
скопировать код в буфер обмена
  1. preg_match_all("/(?:^|[^А-ЯЁ])[А-ЯЁ]{3}(?:[^А-ЯЁ]|$)/ui",$string,$matches);

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

(Отредактировано автором: 25 Сентября, 2014 - 21:20:18)

 
 Top
xodos
Отправлено: 25 Сентября, 2014 - 21:51:11
Post Id


Новичок


Покинул форум
Сообщений всего: 7
Дата рег-ции: Апр. 2013  


Помог: 0 раз(а)




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
Регуляркой лишь предварительно очистил на всякий от запятых точек и прочего...
 
 Top
dcc0
Отправлено: 25 Сентября, 2014 - 22:17:34
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Никто не запрещает делать два прохода по одной строке:
PHP:
скопировать код в буфер обмена
  1.  
  2. $string = "Сыр масло лук суп";
  3. preg_match_all("!^[А-Яёа-яё]{3}|[А-Яёа-яё]{3}$!ui", $string, $matches);
  4. preg_match_all("! [А-Яёа-яё]{3} !ui", $string, $matches2);  
  5.  
  6.  

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

(Отредактировано автором: 25 Сентября, 2014 - 22:20:46)



-----
Март 2021. Бросил программирование
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Регулярные выражения »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB