Как захватить содержимое 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;
Author: Alive to Die, 2008-09-02

4 answers

Ну, sysrqb позволит вам сопоставить что-либо в первом абзаце, предполагая, что в этом абзаце нет другого html. Возможно, вам захочется чего-то большего, чем это

<p>.*?</p>

Размещение ? после вашего * делает его не жадным, что означает, что он будет соответствовать только тому небольшому тексту, который необходим, прежде чем сопоставлять </p>.

 18
Author: Kibbee, 2013-10-25 13:18:27

Если вы используете preg_match, используйте флаг "U", чтобы сделать его не жадным.

preg_match("/<p>(.*)<\/p>/U", $blog_post, &$matches);

$matches[1] затем будет содержаться первый абзац.

 6
Author: Erik Öjebo, 2013-06-01 19:06:44

Вероятно, было бы проще и быстрее использовать 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>'));

Редактировать: На самом деле регулярное выражение в ответах других будет проще и быстрее... ваше большое сложное регулярное выражение в вопросе смутило меня...

 1
Author: Jeremy Ruten, 2008-09-02 05:06:32

Использование регулярных выражений для синтаксического анализа 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]');
 0
Author: eLRuLL, 2017-12-16 22:53:30