6 votes

preg_replace seulement à l'extérieur des balises ? (... nous ne parlons pas d'une analyse html complète, juste d'un peu de markdown)

Quel est le moyen le plus simple d'appliquer la mise en évidence d'un texte à l'exclusion du texte contenu dans les balises OCCASIONNELLES "<...>" ?

CLARIFICATION : Je veux que les étiquettes existantes soient PRÉSERVÉES !

$t = 
preg_replace(
  "/(markdown)/",
  "<strong>$1</strong>",
"This is essentially plain text apart from a few html tags generated with some
simplified markdown rules: <a href=markdown.html>[see here]</a>");

Ce qui devrait s'afficher comme suit :

"Il s'agit essentiellement de texte brut, à l'exception de quelques balises html générées à l'aide d'un système simplifié. démarque règles : voir ici "

... MAIS PAS D'ENTRAINEMENT du texte à l'intérieur de la balise d'ancrage (c.-à-d. <a href=markdown.html> ).

J'ai entendu les arguments selon lesquels il ne faut pas analyser le html avec des expressions régulières, mais ici nous parlons essentiellement de texte brut, à l'exception de l'analyse minimale de certains codes markdown.

4voto

ajo Points 306

En fait, cela semble fonctionner correctement :

<?php
$item="markdown";
$t="This is essentially plain text apart from a few html tags generated 
with some simplified markdown rules: <a href=markdown.html>[see here]</a>";

//_____1. apply emphasis_____
$t = preg_replace("|($item)|","<strong>$1</strong>",$t);

// "This is essentially plain text apart from a few html tags generated 
// with some simplified <strong>markdown</strong> rules: <a href=
// <strong>markdown</strong>.html>[see here]</a>"

//_____2. remove emphasis if WITHIN opening and closing tag____
$t = preg_replace("|(<[^>]+?)(<strong>($item)</strong>)([^<]+?>)|","$1$3$4",$t);

// this preserves the text before ($1), after ($4) 
// and inside <strong>..</strong> ($2), but without the tags ($3)

// "This is essentially plain text apart from a few html tags generated
// with some simplified <strong>markdown</strong> rules: <a href=markdown.html>
// [see here]</a>"

?>

Une chaîne comme $item="odd|string" poserait quelques problèmes, mais je n'utiliserai pas ce genre de chaîne de toute façon... (il faudrait probablement htmlentities(...) ou quelque chose du genre...)

1voto

Gumbo Points 279147

Vous pourriez diviser la chaîne en étiquette ‍/‍ sans étiquette pièces en utilisant preg_split :

$parts = preg_split('/(<(?:[^"\'>]|"[^"<]*"|\'[^\'<]*\')*>)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE);

Vous pouvez ensuite itérer les parties en sautant toutes les parties paires (c'est-à-dire la partie étiquette ) et y appliquer votre remplacement :

for ($i=0, $n=count($parts); $i<$n; $i+=2) {
    $parts[$i] = preg_replace("/(markdown)/", "<strong>$1</strong>", $parts[$i]);
}

A la fin, tout est remis en place avec implode :

$str = implode('', $parts);

Mais attention, ce n'est pas vraiment la meilleure solution. Il est préférable d'utiliser un analyseur HTML digne de ce nom, comme la bibliothèque DOM de PHP. Voir par exemple ces questions connexes :

1voto

Sergi Mayordomo Points 21

Remplacez d'abord toute chaîne de caractères après une balise, mais forcez votre chaîne de caractères à se trouver après une balise :

$t=preg_replace("|(>[^<]*)(markdown)|i",'$1<strong>$2</strong>',"<null>$t");

Ensuite, supprimez votre étiquette forcée :

$show=preg_replace("|<null>|",'',$show);

0voto

TJHeuvel Points 7364

Cette expression rationnelle doit supprimer toutes les balises HTML d'ouverture et de fermeture : /(<[.*?]>)+/

Vous pouvez l'utiliser avec preg_replace comme suit :

$test = "Hello <strong>World!</strong>";
$regex = "/(<.*?>)+/";

$result = preg_replace($regex,"",$test);

0voto

Simon Points 1176

Vous pouvez diviser votre chaîne en un tableau à chaque '<' ou '>' en utilisant preg_split() puis parcourir ce tableau en boucle et ne remplacer que les entrées ne commençant pas par un ">". Ensuite, vous combinez votre tableau en une chaîne de caractères en utilisant implode() .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X