PHP Regexp: Подшаблон, который может встречаться более одного раза - PullRequest
0 голосов
/ 27 октября 2009

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

<tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
</tr>
<tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
    <td>7181</td>
</tr>

Теперь мне нужно выражение, которое ищет каждую строку таблицы и может обрабатывать динамические числа ([0-9] {4}). Поэтому, если есть две ячейки, я хотел бы получить массив с двумя значениями, если их три, в моем массиве должны быть все три значения.

Мое регулярное выражение ДОЛЖНО начинаться и заканчиваться на:

!<tr> ..... </tr>!sU

Возможно ли это?

Ответы [ 3 ]

2 голосов
/ 27 октября 2009

это должно помочь вам начать

$html = ...as above
preg_match_all('~<tr>.+?(\d+).+?</tr>~si', $html, $matches);
print_r($matches);
1 голос
/ 27 октября 2009

Теперь я хочу выражение, которое ищет каждую строку таблицы и может обрабатывать динамические числа ([0-9] {4}). Поэтому, если есть две ячейки, я хотел бы получить массив с двумя значениями, если их три, в моем массиве должны быть все три значения. (...) Это возможно?

Нет, это не так. Вы не можете написать шаблон с динамическим числом под-шаблонов.

Мое регулярное выражение ДОЛЖНО начинаться и заканчиваться на:
!<tr> ..... </tr>!sU

Почему это?

Если вы действительно хотите использовать регулярные выражения вместо использования синтаксического анализатора XML или чего-то более прощающего, например Tidy, я предлагаю двухэтапный подход.

Первый шаг : Найти <tr> строк:

!<tr>(.*?)</tr>!

Второй шаг : перебрать результаты и найти <td> s:

!<td>(?:<[^>]+>)*(\d{4})(?:<[^>]+>)*</td>!

Это позволит найти последовательности из 4 десятичных символов (0-9) в пределах <td>, а также будет соответствовать вложенным тегам форматирования, таким как

<td><strong>1234</strong></td>
1 голос
/ 27 октября 2009

regexp, как известно, плохо оценивает иерархические структуры, особенно в xml. Вам гораздо лучше использовать SimpleXML или DOMDocument с DOMXPath

См. http://www.php.net/manual/en/simplexmlelement.xpath.php, как использовать Xpath с SimpleXML

и

http://www.php.net/manual/en/domxpath.evaluate.php о том, как это можно сделать с помощью DOMXPath.

Обратите внимание, что если ваш случай так же прост, как приведенный в вопросе, тогда SimpleXML - лучший выбор. В некоторых случаях DOMDocument был бы более подходящим, поэтому было бы хорошо иметь больше информации для этого решения

Например:

<?php
$string = <<<XML
<table>
  <tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
  </tr>
  <tr>
    <td>I'm some text</td>
    <td>1234</td>
    <td>1231</td>
    <td>7181</td>
  </tr>
</table>
XML;

$xml = new SimpleXMLElement($string);

/* Search for <a><b><c> */
$result = $xml->xpath('//tr/td[text() = number(text())');

while(list( , $node) = each($result)) {
    echo $node,"\n";
}

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...