Таблицы регулярных выражений, как соответствовать? - PullRequest
0 голосов
/ 02 октября 2009

Мне нравится возвращать строки в этой таблице

<tr class="rowodd" onclick="window.location.href='/portal/offers/show/entityId/32114';">
  <td>01.10.2009</td>
   <td>AN09551</td>
     <td>[2009132] Ich bin Un.&nbsp;<a href="/portal/clients/show/entityId/762350"><myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a></td>
   <td class="number" title="7.500,00Â&nbsp;€">7.500,00Â&nbsp;</td>
    <td>Entwurf</td>
     </tr> 

Я попробовал также это:

#<tr>.*?<t.*?>(.*?)</t.*?>.*?<t.*?>(.*?)</t.*?>.*?<t.*?>(.*?)</t.*?>.*?</tr>#s

Может кто-нибудь помочь?

Ответы [ 6 ]

3 голосов
/ 02 октября 2009

Как отметили / отметили многие люди, вам гораздо лучше использовать синтаксический анализатор HTML / XML для вышеуказанного (например, этот ). HTML не является регулярным, и при использовании регулярного выражения существует множество крайних вариантов кода.

Учитывая, что вы просто хотите извлечь текст, возможно, XPath поможет. Выражение, такое как:

/tr/td/text() 

может добиться цели.

1 голос
/ 02 октября 2009

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

Постарайтесь быть максимально явным:

#<tr\b(?:[^"'>]*|"[^"]*"|'[^']*')*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
    <td\b(?:[^"'>]*|"[^"]*"|'[^']*')*>((?:[^<]|(?!</td\s*>)<)*)</td\s*>\s*
</tr\s*>#sx

Но, как вы видите, это беспорядок.

Вам лучше использовать HTML-анализатор, такой как DOMDocument . Затем вы можете запросить элементы с помощью XPath, как предложил Брайан Агнью. Это намного надежнее и удобнее, чем регулярные выражения.

1 голос
/ 02 октября 2009

Попробуйте:

// http://simplehtmldom.sourceforge.net/
include('simple_html_dom.php');
$str = '<tr class="rowodd" onclick="window.location.href=\'/portal/offers/show/entityId/32114\';">
  <td>
    01.10.2009
  </td>
  <td>
    AN09551
  </td>
  <td>
    [2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350">
    <myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a>
  </td>
  <td class="number" title="7.500,00">
    7.500,00
  </td>
  <td>
    Entwurf
  </td>
</tr>';
$html = str_get_html($str);
foreach($html->find('td') as $element) {
  echo trim($element->innertext) . "\n";
}

Выход:

01.10.2009
AN09551
[2009132] Ich bin Un. <a href="/portal/clients/show/entityId/762350">
    <myimsrc="/img/bullet_go.pngs" alt="" title="Kundenakte aufrufen"></a>
7.500,00
Entwurf
0 голосов
/ 02 октября 2009

В мире PHP есть preg_match_all, что делает его намного проще, чем в JS.

$ptn = "/<\s*td[^>]*>([^<^>]*)</;
preg_match_all($ptn, $str, $matches);
print_r($matches);

Проверьте результат в Preg Tester

0 голосов
/ 02 октября 2009

В противном случае с помощью регулярного выражения вы можете использовать это (с многострочным параметром):

(?:\<td[^\>]*?\>([^\<]*?)\</td\>)+

Но, как заметил @Brian Agnew, это не так хорошо, как анализатор XML / HTML ...

0 голосов
/ 02 октября 2009

не strip_tags вариант?

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

в вашем случае это приведет к:

  01.10.2009
   AN09551
     [2009132] Ich bin Un. 
   7.500,00 € 
    Entwurf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...