Я пытаюсь сделать регулярное выражение для вывода некоторых данных из таблицы.
код, который у меня есть сейчас:
<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>%
Но теперь я застрял.
Типичное регулярное выражение, вероятно, работает, но вы можете захотеть использовать функциональность 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);