Имеется вот такой говно код:
$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, ваш код не работает.
Да, забыл сказать что строка (как и все на сайте) в utf-8 кодировке.
Array
(
[0] => Array
(
[0] => банан
[1] => вк�
[2] => �
[3] => н�
[4] => й �
[5] => жин
[6] => де�
[7] => е�
[8] => �
[9] => �
[10] => ок�
[11] => �
[12] => пок�
[13] => �
[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) |
Скобки по умолчанию жадные, т.е. в массиве совпадений появится ненужные элементы. ?: отключает жадность. |
Интересно сказал :)
Правильнее будет: группировка без обратной связи.
А если человеческим языком то, когда после ( стоит ?: значит текст который будет совпадать с шаблоном который в свою очередь находится между ( ) не будет попадать в выходной массив.
Понятней? Не?