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.

0voto

Floern Points 11484

En fait, ce n'est pas très efficace, mais cela a fonctionné pour moi

$your_string = '...';

$search = 'markdown';
$left = '<strong>';
$right = '</strong>';

$left_Q = preg_quote($left, '#');
$right_Q = preg_quote($right, '#');
$search_Q = preg_quote($search, '#');
while(preg_match('#(>|^)[^<]*(?<!'.$left_Q.')'.$search_Q.'(?!'.$right_Q.')[^>]*(<|$)#isU', $your_string))
  $your_string = preg_replace('#(^[^<]*|>[^<]*)(?<!'.$left_Q.')('.$search_Q.')(?!'.$right_Q.')([^>]*<|[^>]*$)#isU', '${1}'.$left.'${2}'.$right.'${3}', $your_string);

echo $your_string;

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