RegEx не работает с прогнозом! - PullRequest
0 голосов
/ 18 июля 2010

Эй, ребята, я пытаюсь сопоставить "адрес" на этой странице -

http://www.bbb.org/norfolk/business-reviews/tax-return-preparation/liberty-tax-service-in-virginia-beach-va-48000604

Источник адресной части имеет этот HTML

<tr>
    <td align="right" class="generalinfo_left">Address:</td>
    <td class="generalinfo_right">1 S Main St Ste 1430<br /></td>
</tr>
<tr>
    <td align="right" class="generalinfo_left"></td>
    <td class="generalinfo_right">Dayton, OH 45402</td>
</tr>

Итак, я попробовал следующий RegEx в PHP.

"%Address:</td>(.*?)(?!<br />)</td>%s"

где "s" - модификатор для "." чтобы соответствовать новым линиям тоже. Но это не работает. Он не соответствует части "Dayton, OH 45402". Кто-нибудь может сказать мне, почему?

Ответы [ 3 ]

1 голос
/ 18 июля 2010

Пожалуйста, не пытайтесь анализировать HTML с регулярными выражениями, он вызывает гнев Zalgo .

Попробуйте использовать DOM и xpath , чтобы указать конкретные элементы и атрибуты, которые вы пытаетесь извлечь.

(я бы предоставил пример xpath, но он все еще в моем списке для изучения ... :))

0 голосов
/ 18 июля 2010

Это довольно нормально: если вы посмотрите на пример текста, вы увидите, что между Address и Dayton, OH 45402, у вас есть <br />. (?!<br />), в частности, указано, что он не должен совпадать, если найден <br />.

Вы должны использовать парсер для HTML.

Тем не менее, при условии, что все ваши файлы точно такие же, как этот пример, это уродливое регулярное выражение должно работать:

%(Address:)(.*?generalinfo_right">)(.*?)((<br />)|(</td>))(.*?generalinfo_right">)(.*?)((<br />)|(</td>))%s

Группы 1, 3 и 8 содержат адрес.

Однако, поскольку, скорее всего, ваши документы не совсем такие, гораздо лучшим решением будет анализ HTML с правильным синтаксическим анализатором.

0 голосов
/ 18 июля 2010

.*? проходит до конца <br />.Затем следующий текст - «</td>», поэтому предварительный просмотр завершается неудачно, и совпадение успешно, с перехватом "<td class="generalinfo_right">1 S Main St Ste 1430<br />".Другими словами, предварительный просмотр не предотвращает совпадение, потому что слишком поздно.

Есть способы написать это правильно (например, вы можете явно добавить <tr> и затем <td class="generalinfo_right">. Однако ЧарльзПравильно, что вы должны использовать настоящий парсер.

...