[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярное выражение для поиска слов в строке
gidrosoldat
Добрый день!

Имеется вот такой говно код:


$tag_string = 'банан, вкусный ужин, десерт, фокус-покус, 46801 , , , /-*/-, пиво';
$tag_array = explode(',', $tag_string);

$trimmed_tag_array = array();
foreach($tag_array as $tag)
{
$trimmed_tag = trim($tag);
if (preg_match('#[a-zа-яё]+#ui', $trimmed_tag))
$trimmed_tag_array[] = $trimmed_tag;
}

var_dump($trimmed_tag_array);

Тут из введенной строки тэгов надо получить слова (или пару слов), отделенные друг от друга запятыми, убрать лишние пробельные символы(оттримить) и сложить их одномерный массив.
Результат должен получится:
array(5) (
0 => string(10) "банан"
1 => string(23) "вкусный ужин"
2 => string(12) "десерт"
3 => string(21) "фокус-покус"
4 => string(8) "пиво"
)


Можно ли это сделать одним паттерном с preg_match_all() ?



Спустя 10 минут, 49 секунд (19.01.2012 - 19:04) killer8080 написал(а):
$t = 'банан, вкусный ужин, десерт, фокус-покус, 46801 , , , /-*/-, пиво';
preg_match_all('#[a-zа-яё]+(?:(?: |-)[a-zа-яё]+)?#i', $t, $m);
echo '<pre>'.print_r($m, 1).'</pre>';

Спустя 3 минуты, 24 секунды (19.01.2012 - 19:08) gidrosoldat написал(а):
killer8080, ваш код не работает.
Array
(
[
0] => Array
(
[
0] => банан
[1] => вк&#65533;
[2] => &#65533;
[3] => н&#65533;
[4] => й &#65533;
[5] => жин
[6] => де&#65533;
[7] => е&#65533;
[8] => &#65533;
[9] => &#65533;
[10] => ок&#65533;
[11] => &#65533;
[12] => пок&#65533;
[13] => &#65533;
[14] => пиво
)

)


Да, забыл сказать что строка (как и все на сайте) в utf-8 кодировке.

Спустя 2 минуты, 1 секунда (19.01.2012 - 19:10) gidrosoldat написал(а):
Ок, в ваш паттерн добавил модификатор "u" и все заработало ))

Но немного, не так как хотелось. "Фокус-покус" разделился на две части.

Спустя 3 минуты, 29 секунд (19.01.2012 - 19:13) killer8080 написал(а):
Цитата (gidrosoldat @ 19.01.2012 - 18:10)
"Фокус-покус" разделился на две части.

Исправь так, как сейчас в предыдущем посте.

Спустя 4 минуты, 9 секунд (19.01.2012 - 19:17) gidrosoldat написал(а):
 preg_match_all('#[a-zа-яё]+(?:(?: |-)[a-zа-яё]+)?#ui', $t, $m);


Что означают символы (?: |-) ?

Спустя 5 минут, 10 секунд (19.01.2012 - 19:22) killer8080 написал(а):
Цитата (gidrosoldat @ 19.01.2012 - 18:17)
Что означают символы (?: |-) ?

пробел или дефис

Спустя 18 минут, 58 секунд (19.01.2012 - 19:41) gidrosoldat написал(а):
"Пробел или дефис" я и сам понял(кстати, не лучше ли было бы "\s|-" ?). А вот ?: мне не совсем понятно. Случаи когда вопросительный знак со скобками используется или с "+" и "*" мне известны, а вот с ":" я явно упустил.

Подозреваю, что это какой-то знак не обязательного элемента...

Спустя 9 минут, 12 секунд (19.01.2012 - 19:51) killer8080 написал(а):
Цитата (gidrosoldat @ 19.01.2012 - 18:41)
не лучше ли было бы "\s|-" ?).

Нет, тебе же нужен пробел? А \s - это любой пробельный символ, в том числе все виды табуляций и переводы строки.
Цитата (gidrosoldat @ 19.01.2012 - 18:41)
. А вот ?: мне не совсем понятно.

Скобки по умолчанию жадные, т.е. в массиве совпадений появится ненужные элементы. ?: отключает жадность.

Спустя 2 часа, 36 минут, 59 секунд (19.01.2012 - 22:28) Winston написал(а):
Для юникода достаточно
preg_match_all('#\pL+(?:(?: |-)\pL+)?#iu', $t, $m);
Цитата (killer8080 @ 19.01.2012 - 18:51)
Скобки по умолчанию жадные, т.е. в массиве совпадений появится ненужные элементы. ?: отключает жадность.

Интересно сказал :)
Правильнее будет: группировка без обратной связи.
А если человеческим языком то, когда после ( стоит ?: значит текст который будет совпадать с шаблоном который в свою очередь находится между ( ) не будет попадать в выходной массив.
Понятней? Не?
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.