2008-09-02 7 views
6

Hey donc ce que je veux faire, c'est accrocher le contenu pour le premier paragraphe. La chaîne $blog_post contient beaucoup de paragraphes dans le format suivant:Comment saisir le contenu des balises HTML?

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

Le problème que je suis en cours d'exécution en est que je suis en train d'écrire un regex pour saisir tout entre la première balise <p> et la première balise de fermeture </p>. Cependant, il saisit le premier tag <p> et le dernier la fermeture </p> tag qui me fait saisir tout.

Voici mon code actuel:

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; 

Répondre

18

Eh bien, sysrqb vous permettra de correspondre à quelque chose dans le premier paragraphe en supposant qu'il n'y a pas d'autre html dans le paragraphe. Vous voudrez peut-être faire quelque chose comme

<p>.*?</p> 

Placer le ? après votre * rend non gourmand, ce qui signifie qu'il ne correspond que peu de texte que nécessaire avant la </p> correspondant.

1

Il serait probablement plus facile et plus rapide à utiliser strpos() pour trouver la position de la première

<p> 

et premier

</p> 

puis utilisez substr() pour extraire le paragraphe.

$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: En fait, la regex dans les réponses des autres sera plus facile et plus rapide ... votre grand regex complexe dans la question me confondre ...

6

Si vous utilisez preg_match, utilisez le drapeau "U" pour le rendre non-gourmand.

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

$matches[1] contiendra alors le premier paragraphe.

0

L'utilisation d'expressions régulières pour l'analyse HTML n'est jamais la bonne solution. Vous devriez utiliser XPATH pour ce cas particulier:

$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]'); 
Questions connexes