Je suis en train de créer un moteur d'analyse bbcode et j'ai rencontré une situation que je n'arrive pas à résoudre par moi-même.L'expression régulière se bloque Apache en raison des limitations de PCRE
La chose est que je sauté dans un problème exactement comme celui-ci: Apache/PHP on Windows crashes with regular expression
Cela signifie que si je fais quelque chose comme l'exemple ci-dessous Apache tombe en panne à cause du nombre de récursion atteignant 690 (limite de mémoire 1Mo pour PCRE):
$txt = '[b]'.str_repeat('a', 338).'[/b]'; // if I change repeat count to lower value it's ok
$regex = '#\[(?P<attributes>(?P<tag>[a-z0-9_]*?)(?:=.*?|\s.*?|))](?P<content>(?:[^[]|\[(?!/?(?P=tag)])|(?R))+?)\[/(?P=tag)]#mi';
echo preg_replace_callback($regex, function($matches) { return $matches['content']; }, $txt);
Je dois donc en quelque sorte de minimiser la nécessité de *
et +
dans mon regex, mais c'est là où je suis d'idées, donc je si vous peut-être pourrais suggérer quelque chose.
D'autres approches pour l'analyse de bbcode (qui pourraient gérer les balises imbriquées) sont les bienvenues. Cependant, je ne voudrais pas utiliser une classe déjà construite ou quelque chose. J'aime faire les choses par moi-même!
J'ai également examiné PECL et Pear HTML_BBCodeParser. Mais je ne veux pas que mon application dépende des extensions. Plus probablement je peux faire un script qui vérifie cette extension et si elle n'existe pas, utilisez l'analyseur BBCode que j'essaye de faire ici.
Désolé si mes descriptions sont sombres, je ne suis pas pro à l'anglais ^^
EDIT. Donc, l'expression régulière a expliqué:
\[(?P<attributes>(?P<tag>[a-z0-9_]*?)(?:=.*?|\s.*?|))]
Ceci est ma balise d'ouverture. J'ai utilisé des groupes nommés. Avec 'tag' j'identifie tag et avec 'attributs' j'identifie les attributs tags. Pensez à tag comme un attribut aussi. Alors qu'est-ce qui se passe ici? J'essaie de faire correspondre une étiquette, quand une étiquette est appariée, j'essaie de faire correspondre n'importe quoi après =
signe ou quoi que ce soit après \s
(spacer) jusqu'à ce qu'il atteigne la fermeture de l'étiquette ]
.
(?P<content>(?:[^[]|\[(?!/?(?P=tag)])|(?R))+?)
Maintenant, j'essaie de faire correspondre le contenu. C'est la partie difficile. Je suis à la recherche de tout caractère non [et si je trouve tout, puis-je vérifier si ce n'est pas mon tag fin ou récursion, et je dis le moteur de regex de le faire jusqu'à ce que ....
\[/(?P=tag)]
... la balise de fin est trouvée.
- Je dirais que cette option est loin «J'ai également examiné PECL et poire HTML_BBCodeParser Mais je ne veux pas que ma demande soit en fonction des extensions. » plus préférable de réinventer la roue. –
'J'aime faire les choses par moi-même! '- Pourquoi est-ce? Est-ce que tu écris aussi ton propre moteur d'expression régulière? Ou votre propre interpréteur php/runtime? – VolkerK
Btw: Vous pouvez répartir votre code d'expression régulière sur plusieurs lignes et expliquer les parties avec des commentaires. Je pense que cela peut améliorer vos chances d'obtenir de l'aide. – VolkerK