Как получить содержимое тегов HTML?
-
09-06-2019 - |
Вопрос
Привет, я хочу поймать содержимое первого абзаца. Строка $blog_post
содержит множество абзацев в следующем формате:
<p>Paragraph 1</p><p>Paragraph 2</p><p>Paragraph 3</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;
Решение
Что ж, 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>'));
Edit: На самом деле регулярное выражение в ответах других будет легче и быстрее ... Ваш большой сложный регулярный выражение в вопросе смутил меня ...
Использование регулярных выражений для разбора 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]');