Regex pour les PHP men
13 messages
• Page 1 sur 1
-

Mountain Magazin - WRInaute impliqué

- Messages: 598
- Inscription: 1 Oct 2004
Regex pour les PHP men
Salut,
J'ai un souci que j'arrive pas à régler, si un spécialiste des regex passe dans le coin.
j'ai ça :
Vous l'avez compris, je développe une fonction de colorisation de code pour un blog.
Après je fais mes traitements, ça marche nickel, sauf si j'ai des sauts de ligne dans le code ! c'est ballot quand même...
Ca fonctionne
Ca fonctionne pas
Il faut que j'intègre dans mon regex les sauts de ligne et consorts, et je bloque là dessus.
Si quelqu'un peut me donner un coup de main, ce serait sympa.
Merci.
J'ai un souci que j'arrive pas à régler, si un spécialiste des regex passe dans le coin.
j'ai ça :
- Code: Tout sélectionner
preg_match_all('#<code>(.*)</code>#', $chaine, $tab);
Vous l'avez compris, je développe une fonction de colorisation de code pour un blog.
Après je fais mes traitements, ça marche nickel, sauf si j'ai des sauts de ligne dans le code ! c'est ballot quand même...
Ca fonctionne
- Code: Tout sélectionner
<code><?php echo 'Hello World'; ?></code>
Ca fonctionne pas
- Code: Tout sélectionner
<code>
<?php
echo 'Hello World';
echo 'I need some Help';
?>
</code>
Il faut que j'intègre dans mon regex les sauts de ligne et consorts, et je bloque là dessus.
Si quelqu'un peut me donner un coup de main, ce serait sympa.
Merci.
- michel.leonard
- WRInaute discret

- Messages: 184
- Inscription: 1 Juin 2010
Re: Regex pour les PHP men
n'oublie pas d'échapper ton slash dans ta regex ( le faire précéder d'un antislash)...
Et pourquoi preg_match_all tu peux pas faire preg_match ?
Et pourquoi preg_match_all tu peux pas faire preg_match ?
-

seebz - WRInaute impliqué

- Messages: 808
- Inscription: 15 Avr 2007
Re: Regex pour les PHP men
Tu dois utiliser l'option `m` (multiline)
http://fr.php.net/manual/fr/reference.pcre.pattern.modifiers.php
http://fr.php.net/manual/fr/reference.pcre.pattern.modifiers.php
- tonino
- WRInaute discret

- Messages: 55
- Inscription: 21 Jan 2005
Re: Regex pour les PHP men
Bonjour,
essaie d'utiliser l'option "s" (afin que le point reconnaisse les retours à la ligne).
Ce qui donnerait :
PS. il existe d'autres options qui devraient t'intéresser : l'option "i" pour rendre insensible à la casse, l'option "U" (ungreedy = non gourmande) qui pourrait t'être utile en cas d'enchevêtrement de balises...
essaie d'utiliser l'option "s" (afin que le point reconnaisse les retours à la ligne).
Ce qui donnerait :
- Code: Tout sélectionner
preg_match_all('#<code>(.*)</code>#s', $chaine, $tab);
PS. il existe d'autres options qui devraient t'intéresser : l'option "i" pour rendre insensible à la casse, l'option "U" (ungreedy = non gourmande) qui pourrait t'être utile en cas d'enchevêtrement de balises...
-

Blount - WRInaute occasionnel

- Messages: 430
- Inscription: 18 Nov 2010
Re: Regex pour les PHP men
Je te conseil d'utiliser l'option "U" aussi (PCRE_UNGREEDY).
Sinon, tu risques d'avoir des problèmes avec du texte de ce genre :
Les parenthèses vont capturer ceci (sans U) :
Normalement, avec "imsU", tu ne devrais pas avoir de problème. Sachant que "i" est optionnel (pour la casse).
Je ne vois pas pourquoi le slashes devrait être échappé. Il n'a pas de signification dans une regexp.
Sinon, tu risques d'avoir des problèmes avec du texte de ce genre :
- Code: Tout sélectionner
Voici mon premier exemple :
<code>
<?php
echo 'Hello World';
echo 'I need some Help';
?>
</code>
Et pour finir, le deuxième :
<code>
<?php
echo 'Hello World, le retour';
?>
</code>
Les parenthèses vont capturer ceci (sans U) :
- Code: Tout sélectionner
<?php
echo 'Hello World';
echo 'I need some Help';
?>
</code>
Et pour finir, le deuxième :
<code>
<?php
echo 'Hello World, le retour';
?>
Normalement, avec "imsU", tu ne devrais pas avoir de problème. Sachant que "i" est optionnel (pour la casse).
michel.leonard a écrit:n'oublie pas d'échapper ton slash dans ta regex ( le faire précéder d'un antislash)...
Et pourquoi preg_match_all tu peux pas faire preg_match ?
Je ne vois pas pourquoi le slashes devrait être échappé. Il n'a pas de signification dans une regexp.
- tonino
- WRInaute discret

- Messages: 55
- Inscription: 21 Jan 2005
Re: Regex pour les PHP men
J'ai cherché à en savoir plus sur l'option m, mais je n'ai pas l'impression qu'elle réponde à ta problématique du moment (bien que très utile en soi).
Ce lien explique très bien : http://www.phpfrance.com/tutoriaux/index.php/2005/04/10/28-les-express ... e-ripat#oM
Au pire tu as l'option "s"...
Ce lien explique très bien : http://www.phpfrance.com/tutoriaux/index.php/2005/04/10/28-les-express ... e-ripat#oM
Au pire tu as l'option "s"...
-

spout - WRInaute accro

- Messages: 4382
- Inscription: 14 Mai 2003
Re: Regex pour les PHP men
Un peu HS:
Pourquoi ne pas faire le syntax highlighting en JS ?
http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/
Pourquoi ne pas faire le syntax highlighting en JS ?
http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/
-

Mountain Magazin - WRInaute impliqué

- Messages: 598
- Inscription: 1 Oct 2004
Re: Regex pour les PHP men
Oulala, merci à tous pour ces réponses !
Je suis pas très à l'aise avec les REGEX, j'ai peu de temps à y consacrer et pourtant j'en utilise régulièrement. Je vais tenter de répondre à tout le monde.
Parce que je veux isoler plusieurs blocs potentiels dans un même article, sans qu'ils se télescopes. Après j'applique d'autres traitements sur le array() que la fonction retourne.
J'ai rajouté le slash, merci, un oubli.
TROLL: parce que le JS c'est mal
Très de plaisanterie, j'évite au maximum d'alourdir les pages avec des librairies JS. J'en utilise une pour rendre le code de l'éditeur du backOffice plus lisible, mais en front, place à la performance.
Déjà que je load JQuery et quelques plugins (lightbox par exemple, calendar UI...), je préfère limiter au maximum.
Et j'ai donc réglé mon problème grâce à votre aide et je vous en remercie vraiment.
La solution est celle de Blount avec "imsU".
Car si je n'utilise que certaines de ces options, il y a toujours un cas de figure qui merdouille. Notamment lorsqu'il y a plusieurs blocs <code> dans un même article, il les fusionne.
Pour ceux que ça intéresse, voici le code :
Le "highlight_code($v)" correspond à une fonction du framework PHP de Codeigniter 2.0.1 pour ceux qui voudraient la récupérer.
Il me reste un problème (plutôt de performance pour le coup), c'est que le regex me réinjecte les balises <code></code> et que me fonction PHP les ajoute également (comportement que je ne souhaite pas modifier pour diverses raisons).
C'est ce qui explique je j'utilise par deux fois un preg_replace pour retirer les balises <code> et </code> en doublon. Si quelqu'un a une idée...
Sinon, c'est là que l'on voit l'intérêt du preg_match_all et de la fonction qui suit, car si plusieurs blocs dans un article, tu fusionnes tout.
J'utilise une fonction similaire pour rajouter un chemin absolu sur un cookieless domain aux images qui sont ajoutées depuis KCFinder. Toujours pour une question de performances. A l'enregistrement de l'article, j'ajoute ça dans la balise IMG qui n'en n'a pas, plutôt que d'utiliser des chemins relatifs moins performants.
Voilà une affaire rondement menée, merci encore !
Bon WE
Je suis pas très à l'aise avec les REGEX, j'ai peu de temps à y consacrer et pourtant j'en utilise régulièrement. Je vais tenter de répondre à tout le monde.
michel.leonard a écrit:n'oublie pas d'échapper ton slash dans ta regex ( le faire précéder d'un antislash)...
Et pourquoi preg_match_all tu peux pas faire preg_match ?
Parce que je veux isoler plusieurs blocs potentiels dans un même article, sans qu'ils se télescopes. Après j'applique d'autres traitements sur le array() que la fonction retourne.
J'ai rajouté le slash, merci, un oubli.
spout a écrit:Un peu HS:
Pourquoi ne pas faire le syntax highlighting en JS ?
http://www.webdesignbooth.com/9-useful-javascript-syntax-highlighting-scripts/
TROLL: parce que le JS c'est mal
Très de plaisanterie, j'évite au maximum d'alourdir les pages avec des librairies JS. J'en utilise une pour rendre le code de l'éditeur du backOffice plus lisible, mais en front, place à la performance.
Déjà que je load JQuery et quelques plugins (lightbox par exemple, calendar UI...), je préfère limiter au maximum.
Et j'ai donc réglé mon problème grâce à votre aide et je vous en remercie vraiment.
La solution est celle de Blount avec "imsU".
Car si je n'utilise que certaines de ces options, il y a toujours un cas de figure qui merdouille. Notamment lorsqu'il y a plusieurs blocs <code> dans un même article, il les fusionne.
Pour ceux que ça intéresse, voici le code :
- Code: Tout sélectionner
<?php
// Highlight code
preg_match_all('#<code>(.*)<\/code>#imsU', $chaine, $tab);
if(count($tab[1]) > 0)
{
$resultab = array_values(array_unique($tab[1])); // Suppression des doublons + recalcul des clés du array()
$code = array();
foreach($resultab as $v)
{
$code[] = preg_replace('#<code>#', '', highlight_code($v));
}
$chaine = str_replace(array_values($resultab), array_values(preg_replace('#</code>#', '', $code)), $chaine);
return $chaine;
}
else return $chaine;
?>
Le "highlight_code($v)" correspond à une fonction du framework PHP de Codeigniter 2.0.1 pour ceux qui voudraient la récupérer.
Il me reste un problème (plutôt de performance pour le coup), c'est que le regex me réinjecte les balises <code></code> et que me fonction PHP les ajoute également (comportement que je ne souhaite pas modifier pour diverses raisons).
C'est ce qui explique je j'utilise par deux fois un preg_replace pour retirer les balises <code> et </code> en doublon. Si quelqu'un a une idée...
Sinon, c'est là que l'on voit l'intérêt du preg_match_all et de la fonction qui suit, car si plusieurs blocs dans un article, tu fusionnes tout.
J'utilise une fonction similaire pour rajouter un chemin absolu sur un cookieless domain aux images qui sont ajoutées depuis KCFinder. Toujours pour une question de performances. A l'enregistrement de l'article, j'ajoute ça dans la balise IMG qui n'en n'a pas, plutôt que d'utiliser des chemins relatifs moins performants.
Voilà une affaire rondement menée, merci encore !
Bon WE
-

Blount - WRInaute occasionnel

- Messages: 430
- Inscription: 18 Nov 2010
Re: Regex pour les PHP men
Premièrement, enlève l'antislash devant le slash.
Ce n'est pas un caractère spécial, la preuve :
On voit bien qu'il protège le point, mais pas le slash.
Ensuite, regarde du coté de preg_replace_callback.
Pour chaque correspondance, il va appeler une fonction pour remplacer la chaîne par ce que tu veux.
Tu n'as plus qu'à créer une fonction pour colorer ton code. Cette fonction peux même être "highlight_code".
En clair, tout ton code pourrait ressembler à ceci:
Ça simplifierait ton code.
Ce n'est pas un caractère spécial, la preuve :
- Code: Tout sélectionner
jerome@jerome:~$ php -r "echo preg_quote('.').\"\n\";"
\.
jerome@jerome:~$ php -r "echo preg_quote('/').\"\n\";"
/
On voit bien qu'il protège le point, mais pas le slash.
Ensuite, regarde du coté de preg_replace_callback.
Pour chaque correspondance, il va appeler une fonction pour remplacer la chaîne par ce que tu veux.
Tu n'as plus qu'à créer une fonction pour colorer ton code. Cette fonction peux même être "highlight_code".
En clair, tout ton code pourrait ressembler à ceci:
- Code: Tout sélectionner
$chaine = preg_replace_callback('#<code>(.*)</code>#imsU', 'highlight_code', $chaine)
Ça simplifierait ton code.
-

Mountain Magazin - WRInaute impliqué

- Messages: 598
- Inscription: 1 Oct 2004
Re: Regex pour les PHP men
Salut,
Merci pour l'info, j'avais testé cette fonction, mais je n'avais pas pensé à appeler directement la fonction de mon framework depuis preg_replace_callback()
Je vais testé, effectivement, c'est plus simple, mais est ce que je vais obtenir le résultat souhaité. Mystère.
Je posterai en début dès que j'aurais fait l'essai.
Merci et bon WE.
Merci pour l'info, j'avais testé cette fonction, mais je n'avais pas pensé à appeler directement la fonction de mon framework depuis preg_replace_callback()
Je vais testé, effectivement, c'est plus simple, mais est ce que je vais obtenir le résultat souhaité. Mystère.
Je posterai en début dès que j'aurais fait l'essai.
Merci et bon WE.
- stephdim
- Nouveau WRInaute

- Messages: 46
- Inscription: 8 Nov 2006
Re: Regex pour les PHP men
Salut,
Pour le regex, je dirais :
n'oublies pas de doubler le backslash dans php
il faut bien mettre le point d'interrogation pour que le remplacement se fasse en mode ungreedy (non gourmand) sinon tu auras un problème avec ce genre de situation:
qui deviendra
@+
Pour le regex, je dirais :
- Code: Tout sélectionner
/<code>.*?<\/code>/is
n'oublies pas de doubler le backslash dans php
il faut bien mettre le point d'interrogation pour que le remplacement se fasse en mode ungreedy (non gourmand) sinon tu auras un problème avec ce genre de situation:
- Code: Tout sélectionner
<code>blabla</code>
blabla
<code>blabla</code>
blabla
qui deviendra
- Code: Tout sélectionner
<code>remplacement</code>
blabla
@+
-

Mountain Magazin - WRInaute impliqué

- Messages: 598
- Inscription: 1 Oct 2004
Re: Regex pour les PHP men
Bonjour,
Merci à tous pour votre aide, comme indiqué dans un précédent topic, la solution a été trouvée.
Finalement, l'utilisation de la fonction preg_replace_callback ne convient pas, j'ai conservé mon code (j'avais des array au mileu de string, pas gérable).
Le code indiqué plus haut fonctionne très bien, il n'est pas très élégant, mais ça fonctionne et ça ne pompe pas trop de ressources, surtout que les pages sont mises à en cache de façon définitive, sauf modification dans le backOffice.
@stephdim : dans le cas présent, .*? ne fonctionne pas, ça me regroupe les blocs <code> en un seul et me sème la pagaille. Merci quand même de l'idée, fonctionnelle si un seul bloc.
Bonne semaine
Merci à tous pour votre aide, comme indiqué dans un précédent topic, la solution a été trouvée.
Finalement, l'utilisation de la fonction preg_replace_callback ne convient pas, j'ai conservé mon code (j'avais des array au mileu de string, pas gérable).
Le code indiqué plus haut fonctionne très bien, il n'est pas très élégant, mais ça fonctionne et ça ne pompe pas trop de ressources, surtout que les pages sont mises à en cache de façon définitive, sauf modification dans le backOffice.
@stephdim : dans le cas présent, .*? ne fonctionne pas, ça me regroupe les blocs <code> en un seul et me sème la pagaille. Merci quand même de l'idée, fonctionnelle si un seul bloc.
Bonne semaine
13 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- [PHP] Regex ?
- [PHP] REGEX pour dire OU
- [PHP] Probleme avec les regex
- [PHP-Regex] Capture d'un nom de dossier
- Dédoublage des espaces avec une regex php
- Aide pour script PHP (notamment Regex), récompensé
- On peut mettre une fonction php dans un pattern de regex ?
- [Regex] modifier une regex existante
- Yes Men
- [resolu] regex php - remplacement d'une chaine à la fin d'une URL
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
