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