Вопрос

Привет, я хочу поймать содержимое первого абзаца. Строка $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]');
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top