2012-04-27 2 views
0

Может кто-нибудь сказать мне, что случилось с этим регулярным выражением:регулярного выражения вопроса с совпадающим первым вхождением

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

$string = "Red is a sexy colour. Yellow too. Pink too. Blue too. Green too. Hehe."; 

preg_match('/^.*\b(red|green|blue|yellow)\b.*$/i', $string, $colour); 

echo $colour[1]; // Should say Red, but returns Green... o.O 

print_r на $ цветных шоу:

Array ([0] => Red is a sexy colour. Yellow too. Pink too. Blue too. Green too. Hehe. 
     [1] => Green) 
+0

какой 'echo $ color [0];' выходы? – Elen

+0

print_r показывает: 'Array ([0] => Красный - это сексуальный цвет. Желтый тоже. Розовый тоже. Синий тоже. Зеленый тоже. [1] => Зеленый)' – Menztrual

ответ

3

Вместо того, чтобы наполнитель, прежде чем ваш шаблон ungreedy, вы также можете просто удалить начинку до и после рисунка и анкеров:

preg_match('/\b(red|green|blue|yellow)\b/i', $string, $colour); 

возвратит первый матч.

1

Ваш .* часть жаден, то есть. он соответствует максимально возможному значению перед именем цвета. Для того, чтобы изменить его не жадное использование .*?

preg_match('/^.*?\b(red|green|blue|yellow)\b.*$/i', $string, $colour); 
+0

Конечно, это исправлено. Можете ли вы объяснить, почему это происходит? – Menztrual

+0

За 9 минут до этого я могу отметить его. До тех пор; У моего первого родившегося ребенка – Menztrual

2

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

Другими словами, шаблон, который вы указали, попытается найти четыре цветных слова из конца конца строки. Вы можете сделать это не жадным (заменив сначала .*.*?) - или попробуйте полностью изменить шаблон.

Я вижу мало пользы для^и $ маркеров, а затем. *, Например, если вы просто ищете эти слова, почему не использовать что-то просто ...

/\b(red|green|blue|yellow)\b/ 
+0

+1 за то, что я на 17 секунд быстрее меня с правильным ответом. – stema

+0

Спасибо, на самом деле подумал о том, чтобы написать подробное объяснение, почему лучше использовать этот шаблон, но вскоре он ушел.) – raina77ow

Смежные вопросы