Regex не соответствует ни по какой очевидной причине - PullRequest
0 голосов
/ 03 июля 2010

Рассмотрим два следующих фрагмента регулярного выражения и фиктивный HTML, которые должны соответствовать:

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

http://pastebin.com/Qj1uxfdk

Разница между двумя фрагментами, если кому-то интересно, это удаленная (((.{2,20}?), (.{2,20}?))?) примерно на полпутичерез фрагмент.

Первый фрагмент не соответствует тексту, но второй соответствует, и я не могу понять, почему.Я попытался поместить фиктивное выражение, которое должно соответствовать чему-либо на своем месте (например, (.{1})?), и оно все равно не соответствует ему, но когда я его удаляю, оно вдруг снова совпадает.

Я был занят этим глупым выражением в течение последних 4 часов, и я почти сошел с ума.Кто-нибудь может помочь?

Ответы [ 3 ]

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

Было немного легче переписать его, чем отлаживать, поэтому вот мой подход:

preg_match_all(
    '%<tr>[^<]*
      <td[^>]*><a.*?employee_id=(\d*).*?>(\w*)\s*.*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*),\s*(\w*).*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*).*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*).*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*).*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*).*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*).*?&nbsp;</td>[^<]*
      <td[^>]*><a[^>]*>(.*?)</a>.*?&nbsp;</td>[^<]*
      <td[^>]*>(\d{3}\.\d{3}\.\d{4}).*?&nbsp;</td>[^<]*
      <td[^>]*>(\w*).*?&nbsp;</td>[^<]*
    </tr>%sx', 
    $subject, $result, PREG_SET_ORDER);

Это работает для вашего примера, и вы можете настроить его, если вам нравится более или менее проверка.

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

Поскольку вы, похоже, знаете, что RegEx на самом деле не подходит для анализа HTML,
почему вы все еще пытаетесь ..?

DOM, например, не так сложно, как вы думаете;
Базовый пример получения всех тд в вашем HTML:

$html = <<< EOL
<tr><td nowrap class="border_on_rbl"><a href="employee_view.html?employee_id=1337">bloblaw</td><td nowrap class="border_on_rb">Loblaw, Bob</b></td><td nowrap class="border_on_rb">Lawyer</td>
<td nowrap class="border_on_rb">Legal</td>
<td nowrap class="border_on_rb">person4</td><td nowrap class="border_on_rb"></td><td nowrap class="border_on_rb">Bluth, Maeby</td><td nowrap class="border_on_rb"><a href=mailto:bloblaw@theplanet.com>bloblaw@theplanet.com</a></td><td nowrap class="border_on_rb">555.555.5555</td><td nowrap class="border_on_rb">1337</td></tr>
EOL;

libxml_use_internal_errors(true);
$dom = DOMDocument::loadHTML($html);

$tds = $dom->getElementsByTagName('td');
foreach ($tds as $td) {
    echo $td->nodeValue.'<br>';
}

?>

Потратьте некоторое время, чтобы прочитать руководство / некоторые учебные пособия / статьи / .. о DOM, и у вас никогда не возникнет (RegEx) проблем с анализом (не только) HTML ..

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

Мне очень жаль, я знаю, что этот ответ никто не оценит по разным причинам, но в любом случае, я чувствую, что должен это сказать.

Мне кажется, что вы, вероятно, используете не тот инструмент. Я предлагаю вам использовать настоящий парсер, предназначенный для разбора (x) html / xml. Я думаю, html содержит гораздо больше тонкостей, чем вы реально можете уловить с помощью своего регулярного выражения. Я сам давно не писал ни одного php, но я уверен, что у него есть необходимые инструменты, чтобы выполнить разбор для вас ( может быть, это ?).

Конечно, интересно делать все самостоятельно, но практичнее использовать то, что было сделано (и проверено) для вас.

Я надеюсь, что вы будете помнить об этом.

PS: Да, я знаю, что обычное утверждение «Не анализировать xml с регулярным выражением» является крайне банальным / банальным, но это не мешает ему быть правдой в большинстве случаев.

...