php preg соответствует всем, все `p` - PullRequest
0 голосов
/ 21 марта 2011
<?php
$str= <<<ETO
<p>one
two</p>
<p>three</p>
ETO;
preg_match_all('/<p>(.*?)<\/p>/',$str,$r);
print_r($r);
?>

Я учусь preg_match_all. Я хочу получить все p из одной статьи. но мой код только второй получить p. как изменить, чтобы я мог получить первый p, либо. Спасибо.

Ответы [ 2 ]

4 голосов
/ 21 марта 2011

Вам не хватает флага /ims в конце вашего регулярного выражения.В противном случае . не будет соответствовать разрывам строк (как в первом абзаце).На самом деле /s будет достаточно, но я всегда использую все три для простоты.

Кроме того, preg_match работает во многих простых случаях.Но если вы пытаетесь выполнить более сложное извлечение, попробуйте заменить phpQuery или QueryPath , которые позволяют:

foreach (qp($html)->find("p") as $p)  { print $p->text(); }
2 голосов
/ 21 марта 2011

(. *?) Не соответствует символам новой строки.Попробуйте модификатор / s:

<?php
$str= <<<ETO
<p>one 
two</p>
<p>three</p>
ETO;
preg_match_all('/<p>(.*?)<\/p>/s',$str,$r);
print_r($r);
?>
...