PHP регулярное выражение для извлечения данных из таблицы HTML - PullRequest
0 голосов
/ 20 июля 2009

Я пытаюсь сделать регулярное выражение для извлечения некоторых данных из таблицы.

код, который я получил сейчас:

<table>
   <tr>
     <td>quote1</td>
     <td>have you trying it off and on again ?</td>
   </tr>
   <tr>
     <td>quote65</td>
     <td>You wouldn't steal a helmet of a policeman</td>
   </tr>
</table>

Это я хочу заменить на:

quote1: ты пробовал и снова включал?

quote65: Вы бы не украли шлем полицейского

код, который я уже написал, таков:

%<td>((?s).*?)</td>%

Но теперь я застрял.

Ответы [ 5 ]

4 голосов
/ 20 июля 2009

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

$str = <<<A
<table>
   <tr>
     <td>quote1</td>
     <td>have you trying it off and on again ?</td>
   </tr>
   <tr>
     <td>quote65</td>
     <td>You wouldn't steal a helmet of a policeman</td>
   </tr>
</table>
A;

$matches = array();
preg_match_all('#<tr>\s+?<td>(.*?)</td>\s+?<td>(.*?)</td>\s+?</tr>#', $str, $matches);

var_dump($matches);

Несколько слов о регулярном выражении:

  • <tr>
  • тогда любое количество пробелов
  • , затем <td>
  • то, что вы хотите захватить
  • , затем </td>
  • и снова то же самое
  • и, наконец, </tr>

И я использую:

  • ? в регулярном выражении для сопоставления в не жадном режиме
  • preg_match_all чтобы получить все совпадения

Затем вы получите требуемые результаты в $matches[1] и $matches[2] (не $matches[0]) ; вот вывод var_dump, который я использовал (я удалил запись 0, чтобы сделать ее короче) :

array
  0 => 
    ...
  1 => 
    array
      0 => string 'quote1' (length=6)
      1 => string 'quote65' (length=7)
  2 => 
    array
      0 => string 'have you trying it off and on again ?' (length=37)
      1 => string 'You wouldn't steal a helmet of a policeman' (length=42)

Тогда вам просто нужно манипулировать этим массивом с конкатенацией некоторых строк или чем-то подобным; например, вот так:

$num = count($matches[1]);
for ($i=0 ; $i<$num ; $i++) {
    echo $matches[1][$i] . ':' . $matches[2][$i] . '<br />';
}

И вы получите:

quote1:have you trying it off and on again ?
quote65:You wouldn't steal a helmet of a policeman

Примечание: вы должны добавить некоторые проверки безопасности (например, preg_match_all должно возвращать true, количество должно быть не менее 1, ...)

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

3 голосов
/ 20 июля 2009

Регулярное выражение Тима, вероятно, работает, но вы можете рассмотреть возможность использования DOM-функциональности PHP вместо регулярного выражения, поскольку оно может быть более надежным при работе с незначительными изменениями в разметке.

См. метод loadHTML

1 голос
/ 20 июля 2009

Как обычно, извлечение текста из HTML и других нерегулярных языков должно выполняться с помощью синтаксического анализатора - здесь могут возникнуть проблемы с регулярными выражениями. Но если вы уверены в структуре ваших данных, вы можете использовать

%<td>((?s).*?)</td>\s*<td>((?s).*?)</td>%

чтобы найти два фрагмента текста. \ 1: \ 2 будет заменой.

Если текст не может занимать более одной строки, вам будет безопаснее сбросить (?s) битов ...

0 голосов
/ 16 июня 2017

Извлечение каждого содержимого из <td>

    preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes);
    var_dump($mathes);
0 голосов
/ 20 июля 2009

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

...