Discussion:
Dans une regexp PCRE, est-il possible de mettre une quote simple entre simples quotes ?
(trop ancien pour répondre)
Jean Francois Ortolo
2014-03-05 10:59:29 UTC
Permalink
Bonjour

Je n'ai pas encore essayé en langage PHP, les regxep suivantes, qui
donnent une erreur :

cat tmp100.txt | egrep -e '\''

Erreur quel que soit le nombre de \ dans la regexp.

Par contre tout ceci fonctionne :

cat tmp100.txt | egrep -e "'"
cat tmp100.txt | egrep -e "\'"
cat tmp100.txt | egrep -e "\""
cat tmp100.txt | egrep -e "\\""
cat tmp100.txt | egrep -e "\\\""
cat tmp100.txt | egrep -e "\\'"


Je ne sais pas si ce problème des simples quotes, concerne aussi les
regexp PCRE de PHP.

Merci beaucoup de me dire si c'est réellement possible de mettre des
simples quotes ( et comment ) entre des simples quotes, dans une regexp
PCRE en PHP. ( Que ce soit dans ou hors d'une classe ).

Le PHP Manual a changé récemment, est beaucoup moins clair et détaillé.

Merci beaucoup de vos réponses.

Jean François Ortolo
Olivier Miakinen
2014-03-05 13:40:50 UTC
Permalink
Bonjour,
Post by Jean Francois Ortolo
Bonjour
Je n'ai pas encore essayé en langage PHP, les regxep suivantes, qui
cat tmp100.txt | egrep -e '\''
Tu as donc testé l'interprétation du shell plutôt que celle de PHP ou
de PCRE.

Dans bash, « echo '\'' » donne le même comportement que ta commande :
il attend la suite.
Post by Jean Francois Ortolo
Erreur quel que soit le nombre de \ dans la regexp.
cat tmp100.txt | egrep -e "'"
echo "'" -> '
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e "\'"
echo "\'" -> \'
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e "\""
echo "\"" -> "
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e "\\""
Tu es sûr de toi ?
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e "\\\""
echo "\\\"" -> \"
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e "\\'"
echo "\\'" -> \'

Tu peux aussi essayer :
cat tmp100.txt | egrep -e \'

sachant que :
echo \' -> '
Post by Jean Francois Ortolo
Je ne sais pas si ce problème des simples quotes, concerne aussi les
regexp PCRE de PHP.
Encore une fois, tu n'as en rien testé PCRE, juste le shell.
Post by Jean Francois Ortolo
Merci beaucoup de me dire si c'est réellement possible de mettre des
simples quotes ( et comment ) entre des simples quotes, dans une regexp
PCRE en PHP. ( Que ce soit dans ou hors d'une classe ).
Dans une regexp PCRE, tout simplement : /'/

Le fait que tu dises « entre des simples quotes » signifie probablement
que tu te préoccupes de la syntaxe des chaînes de caractères en PHP :
<http://fr2.php.net/manual/fr/language.types.string.php#language.types.string.syntax.single>.

Par exemple : '/\'/' (le \ est requis non pas par PCRE mais par la
syntaxe des chaînes en PHP).


Cordialement,
--
Olivier Miakinen
Olivier Miakinen
2014-03-05 15:13:11 UTC
Permalink
Post by Olivier Miakinen
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e '\''
Tu as donc testé l'interprétation du shell plutôt que celle de PHP ou
de PCRE.
il attend la suite.
<http://manpagesfr.free.fr/man/man1/bash.1.html>
Encadrer des caractères entre des apostrophes simples préserve la valeur
littérale de chacun des caractères. Une apostrophe ne peut pas être
placée entre deux apostrophes, même si elle est précédée d'une barre
oblique inverse.
</>

Cordialement,
--
Olivier Miakinen
Jean Francois Ortolo
2014-03-05 16:22:55 UTC
Permalink
Post by Olivier Miakinen
Post by Olivier Miakinen
Post by Jean Francois Ortolo
cat tmp100.txt | egrep -e '\''
Tu as donc testé l'interprétation du shell plutôt que celle de PHP ou
de PCRE.
il attend la suite.
<http://manpagesfr.free.fr/man/man1/bash.1.html>
Encadrer des caractères entre des apostrophes simples préserve la valeur
littérale de chacun des caractères. Une apostrophe ne peut pas être
placée entre deux apostrophes, même si elle est précédée d'une barre
oblique inverse.
</>
Cordialement,
Bonjour Monsieur

Super merci pour votre réponse.

Vous êtes une référence dans ce newsgroup, en matière de
programmation PHP. ;)

Je suis en train actuellement, de migrer le site www.lescourses.com ,
pour qu'il soit transféré vers un nouveau serveur plus récent ( OVH
dédié aussi ).

Actuellement, j'ai adapté toutes les regexp de POSIX vers PCRE, et
les instructions MySQL de type : mysql_*() , vers leur équivalent de la
classe PDO.

Pour faire la translation des instructions, j'ai utilisé deux scripts
Awk de ma fabrication ;) , plus quelques scripts récursifs en Bourne Shell.

Ensuite, je dois corriger chacune des regexp en erreur.

Pour celà, j'ai fait un script php lisant le script en paramètre, et
évaluant la valeur réelle des regexp rencontrées, ( même contenant des
variables ), en évaluant aussi les variables affectées rencontrées.

Ce script php a été lancé dans toute l'arborescence à vérifier.

J'ai obtenu un fichier texte d'environ 8392 lignes ( autant de
regexp ), avec dans chaque ligne :

regexp_interprétée "est dans" pathname_du_script "Ligne = "
numéro_de_ligne "Constante|Variables" noms_des _variables_dans _la
_regexp , instruction_regexp_de_départ.


Il y a quelques jours, j'ai nettoyé ce fichier ( une copie ) de
toutes ses regexp valides, et il reste environ 350 regexp ( 350 lignes )
théoriquement douteuses ou non valides, et j'ai commencé aussi il
quelques jours, à arranger les regexp dans les scripts ( php ).

J"ai regardé dans différents sites sur les regexp PCRE et PHP, et
votre information est pratiquement la dernière info dont j'avais besoin
pour terminer le boulot. ;)

Après avoir corrigé théoriquement toutes les regexp, je devrai tester
le site sur mon ordinateur( sous le répertoire /php6/ ), puis sur le
site en réel ( idem ), puis sur mon ordinateur ( à la racine ), puis sur
le site/ancien serveur en réel ( à la racine aussi ), tout en demandant
au Directeur de mon site partenaire de vérifier aussi

Pour l'instant je suis à la fin de la phase 1 ( vérification des
regexp ), et il y a donc 5 phases.

Votre réponse me permet de faire ces manipulations, avec suffisamment
de certitude que les regexp seront valides quelles que que soient les
modalités d'exécution des scripts du site.

Je suis sur ce boulot depuis quelques semaines. ;)

Merci beaucoup.

Jean François Ortolo
Olivier Miakinen
2014-03-05 19:26:10 UTC
Permalink
Post by Jean Francois Ortolo
Vous êtes une référence dans ce newsgroup, en matière de
programmation PHP. ;)
... surtout quand il ne s'agit pas de PHP mais de shell. :-D
Post by Jean Francois Ortolo
Je suis en train actuellement, de migrer [...]
Tous mes vœux de réussite t'accompagnent. D'ailleurs j'ai plutôt
confiance que cela se passera bien, vu le soin que tu prends à
chaque étape.

Cordialement,
--
Olivier Miakinen
Jean Francois Ortolo
2014-03-06 07:48:49 UTC
Permalink
Post by Olivier Miakinen
Tous mes vœux de réussite t'accompagnent. D'ailleurs j'ai plutôt
confiance que cela se passera bien, vu le soin que tu prends à
chaque étape.
Cordialement,
Bonjour Monsieur

J'ai encore deux questions à poser :

Est-il vrai que l'un ou l'autre de ces caractères,soient des
méta-caractères, et aient des statuts spéciaux dans les regexp PCRE ?

- Le deux -points ":"

- Le dièze : "#".

Je sais bien que le dièze "#" peut servir de délimiteurs, et que dans
ce cas ( et dans ce cas seulement théoriquement ), il faut l'échapper
dans la regexp.

Mais j'ai lu dans un site, que nécessairement, une regexp comportant
un dièze,s'arrêtait à ce dièze, sous-entendu même si ce n'est pas le
délimiteur ?

Quant au deux-points, je ne vois pas quoi il peut bien servir, si
c'est un caractère spécial en PCRE ?

J'ai terminé le nettoyage de mes scripts php, j'ai fait hier soir un
script awk, pour détecter les crochets ( [ ou ] ) foireux ( de classe ou
non, échappés ou non, etc...

Par exemple, je détecte la suite : [ [ ] , ou : [ ] ] , etc...

Merci beaucoup de votre réponse.

Très respectueusement.

Jean François Ortolo
Olivier Miakinen
2014-03-06 08:03:50 UTC
Permalink
Bonjour,
Post by Jean Francois Ortolo
Est-il vrai que l'un ou l'autre de ces caractères,soient des
méta-caractères, et aient des statuts spéciaux dans les regexp PCRE ?
- Le deux -points ":"
- Le dièze : "#".
Non, c'est faux. Ni l'un ni l'autre ne sont des méta-caractères, et ce
aussi bien dans ou hors des classes de caractères (entre crochets) :
<http://fr2.php.net/manual/fr/regexp.reference.meta.php>.
Post by Jean Francois Ortolo
Je sais bien que le dièze "#" peut servir de délimiteurs, et que dans
ce cas ( et dans ce cas seulement théoriquement ), il faut l'échapper
dans la regexp.
Oui. Idem pour le deux-points.
Post by Jean Francois Ortolo
Mais j'ai lu dans un site, que nécessairement, une regexp comportant
un dièze,s'arrêtait à ce dièze, sous-entendu même si ce n'est pas le
délimiteur ?
Sans doute le site traitait-il des commandes telles que grep, appelées
à partir d'un shell unix : s'il n'est pas protégé par des guillemets,
un dièse en ligne de commande démarre un commentaire et arrête donc
l'interprétation des arguments.

Ou alors l'auteur s'est trompé, cela arrive même sur des sites web. ;-)
Post by Jean Francois Ortolo
Quant au deux-points, je ne vois pas quoi il peut bien servir, si
c'est un caractère spécial en PCRE ?
Ce n'en est pas un. Pas plus que le dièse.


Cordialement,
--
Olivier Miakinen
Jean Francois Ortolo
2014-03-06 09:58:24 UTC
Permalink
Post by Olivier Miakinen
Bonjour,
Post by Jean Francois Ortolo
Est-il vrai que l'un ou l'autre de ces caractères,soient des
méta-caractères, et aient des statuts spéciaux dans les regexp PCRE ?
- Le deux -points ":"
- Le dièze : "#".
Non, c'est faux. Ni l'un ni l'autre ne sont des méta-caractères, et ce
<http://fr2.php.net/manual/fr/regexp.reference.meta.php>.
Post by Jean Francois Ortolo
Je sais bien que le dièze "#" peut servir de délimiteurs, et que dans
ce cas ( et dans ce cas seulement théoriquement ), il faut l'échapper
dans la regexp.
Oui. Idem pour le deux-points.
Post by Jean Francois Ortolo
Mais j'ai lu dans un site, que nécessairement, une regexp comportant
un dièze,s'arrêtait à ce dièze, sous-entendu même si ce n'est pas le
délimiteur ?
Sans doute le site traitait-il des commandes telles que grep, appelées
à partir d'un shell unix : s'il n'est pas protégé par des guillemets,
un dièse en ligne de commande démarre un commentaire et arrête donc
l'interprétation des arguments.
Ou alors l'auteur s'est trompé, cela arrive même sur des sites web. ;-)
Post by Jean Francois Ortolo
Quant au deux-points, je ne vois pas quoi il peut bien servir, si
c'est un caractère spécial en PCRE ?
Ce n'en est pas un. Pas plus que le dièse.
Cordialement,
Bonjour Monsieur

Super réponse. ;)

Je n'ai plus qu'à détecter les crochets échappés, avec un script awk.

Je crois que le caractère échappement est : "\\", donc reconnaître
les tokens : "\\[" et "\\]" devrait suffire.

C'est la toute dernière chose que je dois faire pour arranger ces
scripts php.

Super merci Monsieur pour vos réponses. ;)

Merci beaucoup.

Respectueusement.

Jean François Ortolo

Loading...