2012-02-27 2 views
1
$str = 'title="room 5 stars"'; 
preg_match_all('/title="([0-9]+)"/sm', $str, $rate); 

Мне нужно захватить номер 5 из заголовка. Регулярное выражение не работает!Номер Grab с использованием Preg_Match

Если я это сделать:

preg_match_all('/title="([0-9]+)"/sm', $str, $rate); 

я получаю:

'/title="([0-9]+)"/sm' 

Где я ошибся:

room 5 stars 

Однако это один ничего не вернуть?

ответ

3

Вы не принимая во внимание слова вокруг числа, попробуйте следующее:

$str = 'title="room 5 stars"'; 
preg_match_all('/title=".*(\d+).*"/', $str, $rate); 

// The number is then in $rate[1][0]; 
1

Вы забыли, чтобы соответствовать текст до и после номера. Попробуйте с: /title=".*([0-9]+).*"/

PS: Вам не нужно м и сек вариант

0

* жадный матч, он может дать неправильные результаты иногда.

Вы можете использовать /title=".*?(\d+).*?"/, который является ленивым и будет искать наименьшее количество символов.

Вы также можете попробовать этот бесплатный инструмент для сравнения регулярных выражений: RegExr

+0

протестировали на самом деле вы ваше регулярное выражение? Он будет соответствовать строке, но не будет записывать номер. – ohaal

+0

@ohaal не обижайтесь, но не могли бы вы рассказать мне об ошибке, поэтому я не буду этого делать в будущем. Я редактировал код для группового сопоставления. – Vishal

+1

Прошу прощения за то, что не вдаваясь в подробности в своем предыдущем комментарии, я спешил. Убрал -1, поскольку, похоже, вы исправили свой ответ. У вас был '/ title =". *? (\ D) *. *? "/', Который не фиксировал фактическое число. Причина этого заключается в том, что '*' эквивалентен '{0,}', и поскольку нежелательное соответствие '. *?' Не имело ничего общего с ним, вся строка будет сопоставлена ​​с вашим последним не жадным '. *?' match. – ohaal

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