Как получить содержимое тегов HTML? - PullRequest
6 голосов
/ 02 сентября 2008

Эй, вот что я хочу сделать, так это поймать содержимое первого абзаца. Строка $blog_post содержит множество абзацев в следующем формате:

<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</p>

Проблема, с которой я сталкиваюсь, заключается в том, что я пишу регулярное выражение для захвата всего, что находится между первым тегом <p> и первым закрывающим тегом </p>. Тем не менее, он захватывает первый тег <p> и тег last закрывающий </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 ]

18 голосов
/ 02 сентября 2008

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

<p>.*?</p>

Помещение ? после того, как ваш * делает его нежадным, что означает, что перед совпадением с </p>.

текст будет соответствовать только минимальному количеству текста
6 голосов
/ 02 сентября 2008

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

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

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

1 голос
/ 02 сентября 2008

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

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

0 голосов
/ 17 декабря 2017

Использование регулярных выражений для разбора 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]');
...