2008-09-02 4 views
6

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

<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; 

ответ

18

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

<p>.*?</p> 

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

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: Собственно регулярное выражение в ответах других людей будет проще и быстрее ... ваш большой комплекс регулярных выражений в вопросе меня смутило ...

6

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

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

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

0

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