Question

Hé oui, ce que je veux faire est d'accrocher le contenu pour le premier paragraphe.La chaîne $blog_post contient beaucoup de paragraphes dans le format suivant:

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

Le problème, je suis en cours d'exécution, c'est que je suis en train d'écrire une regex pour attraper tout ce qui entre le premier <p> et la balise de clôture de la première </p> la balise.Cependant, il est saisissant de la première <p> tag et le dernière fermeture </p> balise qui provoque en moi l'accaparement de 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;
Était-ce utile?

La solution

Eh bien, sysrqb vous permettra de correspondre à quelque chose dans le premier alinéa, en supposant il n'y a pas d'autres html dans le paragraphe.Vous pourriez vouloir quelque chose de plus comme cela

<p>.*?</p>

Placer le ? après votre * en fait non gourmand en ce sens qu'elle ne correspondent que peu de texte que nécessaire avant d'correspondant à la </p>.

Autres conseils

Si vous utilisez preg_match, utiliser le "U" drapeau à faire de l'onu-gourmand.

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

$matches[1] contiendra alors le premier paragraphe.

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

 <p>

et d'abord

</p>

ensuite, 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 l'expression régulière dans les réponses des autres sera plus facile et plus rapide...votre grand complexe regex dans la question qui me confond...

En utilisant des Expressions Régulières pour l'analyse html n'est jamais la bonne solution.Vous devriez être à l'aide de 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]');
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top