Регулярное выражение PHP для извлечения данных из таблицы HTML

StackOverflow https://stackoverflow.com/questions/1150762

  •  18-09-2019
  •  | 
  •  

Вопрос

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

код, который у меня есть сейчас:

<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>

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

цитата1: ты пробовал это снова и снова?

цитата65:Вы бы не украли каску у полицейского

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

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

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

Это было полезно?

Решение

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

Видеть метод loadHTML

Другие советы

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

$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, как правило, не очень хорошая идея ;если вы можете использовать настоящий парсер, это должно быть намного безопаснее...

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

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

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

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

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

Извлеките каждый контент из <td>

    preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes);
    var_dump($mathes);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top