Как захватить содержимое HTML-тегов?
Эй, так что я хочу сделать, это зацепить содержание первого абзаца. Строка $blog_post
содержит множество абзацев в следующем формате:
<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>
Проблема, с которой я сталкиваюсь, заключается в том, что я пишу регулярное выражение, чтобы захватить все между первым тегом <p>
и первым закрывающим тегом </p>
. Однако он захватывает первый тег <p>
и последний тег , закрывающий тег </p>
, в результате чего я хватаю все.
Вот мой текущий код:
if (preg_match("/[\\s]*<p>[\\s]*(?<firstparagraph>[\\s\\S]+)[\\s]*<\\/p>[\\s\\S]*/",$blog_post,$blog_paragraph))
echo "<p>" . $blog_paragraph["firstparagraph"] . "</p>";
else
echo $blog_post;
4 answers
Ну, sysrqb позволит вам сопоставить что-либо в первом абзаце, предполагая, что в этом абзаце нет другого html. Возможно, вам захочется чего-то большего, чем это
<p>.*?</p>
Размещение ?
после вашего *
делает его не жадным, что означает, что он будет соответствовать только тому небольшому тексту, который необходим, прежде чем сопоставлять </p>
.
Если вы используете preg_match
, используйте флаг "U", чтобы сделать его не жадным.
preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);
$matches[1]
затем будет содержаться первый абзац.
Вероятно, было бы проще и быстрее использовать strpos(), чтобы найти положение первого
<p>
И первый
</p>
Затем используйте substr() для извлечения абзаца.
$paragraph_start = strpos($blog_post, '<p>');
$paragraph_end = strpos($blog_post, '</p>', $paragraph_start);
$paragraph = substr($blog_post, $paragraph_start + strlen('<p>'), $paragraph_end - $paragraph_start - strlen('<p>'));
Редактировать: На самом деле регулярное выражение в ответах других будет проще и быстрее... ваше большое сложное регулярное выражение в вопросе смутило меня...
Использование регулярных выражений для синтаксического анализа html никогда не является правильным решением. Вы должны использовать XPATH для этого конкретного случая:
$string = <<<XML
<a>
<b>
<c>texto</c>
<c>cosas</c>
</b>
<d>
<c>código</c>
</d>
</a>
XML;
$xml = new SimpleXMLElement($string);
/* Busca <a><b><c> */
$resultado = $xml->xpath('//p[1]');