Регулярное выражение не работает. Возвращает пустой массив.

Тимур

Новичок
Регулярное выражение не работает. Возвращает пустой массив.

Здравствуйте Мастера PHP!
Проблема с использованием рег. Выражений.
Задача стояла выдернуть из куска html кода, ту часть, которую я выделил.
И использовал позиционные проверки.
Т.е. находил то, что находиться после <b>Нижнекамск</b> и до </table>.
Но составленное рег. выражение не работает, массив $info пуст.
Помогите найти ошибку в регулярном выражении.
<Code>

<td>
<table>
<tr>
<td><b>Казань</b></td>
...
</tr>
</table>
</td>
<td>
<table>
<tr>
<td><b>Нижнекамск</b></td>
...
</tr>
</table>
</td>
<td>
<table>
<tr>
<td><b>Набережные Челны</b></td>
...
</tr>
</table>
</td>

</code>
preg_match("~(?<=<b>Нижнекамск</b>)[.\s]*(?=</table>)~si",$city,$info);
 

SelenIT

IT-лунатик :)
vedeney
All non-alphanumeric characters other than \, -, ^ (at the
start) and the terminating ] are non-special in character
classes, but it does no harm if they are escaped.
Тимур
пробелы у тебя в паттерне были или их форум добавил? Если были - убирай.
 

Тимур

Новичок
Пробелов не было, форум добавил.
. это вроде все символы кроме перевода строки поэтому еще \s
 

SelenIT

IT-лунатик :)
. - это вообще все символы, какие угодно. Но - не в классах символов, о чем свидетельствует моя цитата из английского мануала. В классах это просто точка.
 

Тимур

Новичок
SelenIT
Я убрал точку и попробывал вот так [\s\S] результат - "Array"
А может быть это из-за того что </table> повторяется в html-коде? Может быть такое?

-~{}~ 11.03.05 18:46:

нет не в </table> дело удалил все таблички после искомой тот же результат. :(
 

SelenIT

IT-лунатик :)
Вот так, вроде бы, работает:
PHP:
preg_match("~<b>Нижнекамск</b>(.*?)</table>~si",$city,$info);
print_r($info[1]);
Обрати внимание на минимизатор жадности. ИМХО, KIS-принцип работает...
 

Тимур

Новичок
SelenIT, Спасибо действительно работает.
"?" это и есть минимизатор жадности? т.е. если бы его не было возратило бы до последнего </table> я так понял.
ЗЫ Я только что про модификатор U прочитал он убирает эту жадность и не нужен ?. так нагляднее получается.
preg_match("~<b>Нижнекамск</b>(.*)</table>~siU",$city,$info);
Еще раз СПАСИБО!!!
Последний ЗЫ: странно... а почему мой вариант не работал. С позиционными проверками. вычитал на этом сайте в статье "Регулярные выражения, Часть II"
 
Сверху