регулярное выражение для соответствия HTML-тега с определенным содержимым - PullRequest
2 голосов
/ 08 февраля 2010

Я пытаюсь написать регулярное выражение для захвата этой строки:

<td style="white-space:nowrap;">###.##</td>

Я даже не могу сопоставить его, если включить строку, как она есть в шаблоне регулярных выражений! Я использую preg_match_all(), но не могу найти правильный шаблон. Я думаю, что "white-space:nowrap;" каким-то образом отбрасывает соответствие. Любая идея? Спасибо ...

Ответы [ 4 ]

4 голосов
/ 08 февраля 2010

Почему бы не попробовать вместо этого использовать документ DOM? Тогда вам не нужно беспокоиться о правильном формате HTML. Использование коллекции Dom Doc также улучшит читабельность и обеспечит быструю производительность, поскольку он является частью ядра PHP, а не находится в пространстве пользователя

2 голосов
/ 08 февраля 2010

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

1 голос
/ 09 февраля 2010

Знаете ли вы, что аргумент regex для любой из функций preg_ в PHP должен иметь двойной разделитель? Например:

preg_match_all(`'/foo/'`, $target, $results)

'...' - это строка разделители, /.../ - регулярное выражение разделители, а фактическое регулярное выражение foo. Разделители регулярных выражений не должны быть косыми чертами, они просто должны совпадать; Некоторые популярные варианты #...#, %...% и ~...~. Они также могут быть сбалансированными парами символов в скобках, например {...}, (...), [...] и <...>; они гораздо менее популярны и не зря.

Если вы пропустите разделители регулярных выражений, фаза компиляции регулярных выражений, вероятно, потерпит неудачу, и сообщение об ошибке, вероятно, не будет иметь смысла. Например, этот код:

preg_match_all('<td style="white-space:nowrap;">###.##</td>', $s, $m)

... сгенерирует это сообщение:

 Unknown modifier '#'

Он пытается использовать первую пару угловых скобок в качестве разделителей регулярных выражений и все, что следует за > в качестве модификаторов регулярных выражений (например, i для регистра без учета регистра, m для многострочного). Чтобы это исправить, вы должны добавить real regex delimiters, например, так:

preg_match_all('%<td style="white-space:nowrap;">###\.##</td>%i', $s, $m)

Выбор разделителя зависит от личных предпочтений и удобства. Если бы я использовал # или /, мне пришлось бы избегать этих символов в настоящем регулярном выражении. Я избежал ., потому что это метасимвол регулярного выражения. Наконец, я добавил модификатор i, чтобы продемонстрировать использование модификаторов и потому что HTML не чувствителен к регистру.

1 голос
/ 08 февраля 2010

Вы видели какие-нибудь предупреждения? Вы должны избежать некоторых битов, а именно / перед тегом td close. Казалось, это работает для меня:

$string='cow cow cow    <td style="white-space:nowrap;">###.##</td> cat cat cat cat';
php > preg_match_all('/<td style="white-space:nowrap;">###\.##<\/td>/',$string,$result);
php > var_dump($result);
array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(43) "<td style="white-space:nowrap;">###.##</td>"
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...