php regex для извлечения данных из таблицы HTML

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

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

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

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

Solutions Collecting From Web of "php regex для извлечения данных из таблицы HTML"

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

См. Метод 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 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, count должно быть не менее 1, …)

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

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

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

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

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

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

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

  preg_match_all("%\<td((?s).*?)</td>%", $respose, $mathes); var_dump($mathes);