Discussion:
Question à propos d'une chaîne regex théorique.
(trop ancien pour répondre)
Jean Francois Ortolo
2012-05-08 10:30:14 UTC
Permalink
Bonjour

J'aurais besoin de reconnaître la chaîne de caractère : "---" dans
une chaîne de caractères.

Je pense faire celà avec la fonction preg_match().

La chaîne $str ne contient jamais de caractère #.

Si je fais :

if(preg_match("#^---$#", $str))

Cette fonction va-t-elle rendre : true si ce qui est contenu dans
$str, est uniquement la chaîne : --- , et false autrement ?

Ou bien, est-ce que je dois spécifier celà :

if(preg_match("#\-\-\-$#", $str))

?


Autrement dit :

La fonction preg_match() , interprète-t-elle toujours son premier
paramètre, comme une regex, et en particulier dans ce cas, la première
syntaxe peut-elle convenir ?

Merci beaucoup de vos réponses.

Bien amicalement.

Jean François Ortolo
YBM
2012-05-08 11:44:09 UTC
Permalink
Post by Jean Francois Ortolo
Bonjour
J'aurais besoin de reconnaître la chaîne de caractère : "---" dans une
chaîne de caractères.
Je pense faire celà avec la fonction preg_match().
La chaîne $str ne contient jamais de caractère #.
if(preg_match("#^---$#", $str))
Peu importe si la chaîne contient ou non des '#'. Par convention
preg_match attent une chaîne contenant une expression régulière
délimitée par un caractère quelconque (ou presque) où une des
caractères appariés comme ( ) ou { } etc. Ces caractère ne font
PAS partie de l'expression régulière.

C'est quand /l'expression régulière/ contient ce caractère de
délimitation (par exemple / - slash) que c'est embêtant et que
l'on en prend un autre.

Personnelement j'utilise toujours {} et donc :

preg_match("{^---$}", $str)
Post by Jean Francois Ortolo
Cette fonction va-t-elle rendre : true si ce qui est contenu dans $str,
est uniquement la chaîne : --- , et false autrement ?
Oui ou presque, si la chaîne est ---\n (\n=fin de ligne ascii) elle
renverra 1 (et non true, mais c'est pareil pour le if) aussi.
Post by Jean Francois Ortolo
if(preg_match("#\-\-\-$#", $str))
tu as oublié l'ancre ^ j'imagine.
^---$ est identique à ^\-\-\-$, tu y protège le tiret mais dans
ce contexte c'est inutile.
Post by Jean Francois Ortolo
La fonction preg_match() , interprète-t-elle toujours son premier
paramètre, comme une regex, et en particulier dans ce cas, la première
syntaxe peut-elle convenir ?
ton "autrement dit" m'inquiète: ça n'a aucun rapport avec la choucroute.

Le premier paramètre de preg_match est une chaîne contenant une regexp
délimitée.

En cas de doute, il n'y a pas de mal à faire des essais (ici sous
GNU/Linux dans un terminal) :

$ cat test.php
<?php
$re = '{^---$}';
echo preg_match($re,'---'),"\n";
echo preg_match($re,"---\n"),"\n";

$re = '{^\-\-\-$}';
echo preg_match($re,'---'),"\n";
echo preg_match($re,"---\n"),"\n";
?>
$ php test.php
1
1
1
1
Jean Francois Ortolo
2012-05-08 12:00:31 UTC
Permalink
Post by YBM
Post by Jean Francois Ortolo
Bonjour
J'aurais besoin de reconnaître la chaîne de caractère : "---" dans une
chaîne de caractères.
Je pense faire celà avec la fonction preg_match().
La chaîne $str ne contient jamais de caractère #.
if(preg_match("#^---$#", $str))
Peu importe si la chaîne contient ou non des '#'. Par convention
preg_match attent une chaîne contenant une expression régulière
délimitée par un caractère quelconque (ou presque) où une des
caractères appariés comme ( ) ou { } etc. Ces caractère ne font
PAS partie de l'expression régulière.
C'est quand /l'expression régulière/ contient ce caractère de
délimitation (par exemple / - slash) que c'est embêtant et que
l'on en prend un autre.
preg_match("{^---$}", $str)
Post by Jean Francois Ortolo
Cette fonction va-t-elle rendre : true si ce qui est contenu dans $str,
est uniquement la chaîne : --- , et false autrement ?
Oui ou presque, si la chaîne est ---\n (\n=fin de ligne ascii) elle
renverra 1 (et non true, mais c'est pareil pour le if) aussi.
Post by Jean Francois Ortolo
if(preg_match("#\-\-\-$#", $str))
tu as oublié l'ancre ^ j'imagine.
^---$ est identique à ^\-\-\-$, tu y protège le tiret mais dans
ce contexte c'est inutile.
Post by Jean Francois Ortolo
La fonction preg_match() , interprète-t-elle toujours son premier
paramètre, comme une regex, et en particulier dans ce cas, la première
syntaxe peut-elle convenir ?
ton "autrement dit" m'inquiète: ça n'a aucun rapport avec la choucroute.
Le premier paramètre de preg_match est une chaîne contenant une regexp
délimitée.
En cas de doute, il n'y a pas de mal à faire des essais (ici sous
$ cat test.php
<?php
$re = '{^---$}';
echo preg_match($re,'---'),"\n";
echo preg_match($re,"---\n"),"\n";
$re = '{^\-\-\-$}';
echo preg_match($re,'---'),"\n";
echo preg_match($re,"---\n"),"\n";
?>
$ php test.php
1
1
1
1
Bonjour Monsieur

Merci beaucoup de votre réponse.

Je ne savais pas pour les caractères délimiteurs { et }

En ce qui me concerne, j'ai pris toutes les précautions pratiques,
pour que les chaînes ne contiennent pas le caractère # ( ni le saut de
ligne \n ).

Normalement, mon script est prêt.

C'est un script très compliqué, une vraie usine à gaz de 25190 lignes
de php en mode iso, mais avant le 31 décembre 2011, il fonctionnait
normalement.

Depuis le 1er Janvier 2012, ce script, qui me sert à enregistrer les
paris gagnés des courses à événements avec les pronostics de mon site (
nouvelle version, j'ai remis l'ancienne version sur mon site
www.pronostics-courses.fr ), ne détecte plus aucun Multi en 7 ou en 6
chevaux gagnés, alors que l'ancienne version en détecte.

Je suis en train de débugguer, et jusqu'à présent ( ce matin ), j'ai
changé tous les caractères séparateurs des regex ( type PCRE ), de / en #

En effet, j'avais fait la faute classique, où certaines chaînes de
caractères, contenaient ce caractère /

J'ai vérifié qu'il n'y avait aucune erreur lors de la modification.

Je n'ai pas beaucoup espoir de réparer ce script, ni d'identifier
l'erreur, vu sa complexité... ;(

En dernier recours, je mettrai la base de données de mon site sur mon
ordinateur, puis je tracerai.

Bien amicalement.

Jean François Ortolo
YBM
2012-05-08 12:24:48 UTC
Permalink
Post by Jean Francois Ortolo
Je suis en train de débugguer, et jusqu'à présent ( ce matin ), j'ai
changé tous les caractères séparateurs des regex ( type PCRE ), de / en #
En effet, j'avais fait la faute classique, où certaines chaînes de
caractères, contenaient ce caractère /
je répète : le problème n'est PAS quand la chaîne testée contient le
délimiteur, mais quand l'expression régulière doit en contenir car
il faut alors le protéger. Avec {...} on a pas ce problème !
Jean Francois Ortolo
2012-05-08 18:27:10 UTC
Permalink
Post by Jean Francois Ortolo
Je n'ai pas beaucoup espoir de réparer ce script, ni d'identifier
l'erreur, vu sa complexité... ;(
En dernier recours, je mettrai la base de données de mon site sur mon
ordinateur, puis je tracerai.
Bien amicalement.
Jean François Ortolo
Rebonsoir

Finalement, j'ai retrouvé dans mes DVD, une version datant de
Septembre 2011, dont j'ai supprimé les appels à la fonction trim(), qui
enlevait les zéros de bord aux chiffres parfois, et j'ai refait toutes
mes stats.

Cà marche correctement.

Url :

www.pronostics-courses.fr/php/stats/new_affic_stats.php

Bien à vous.

Amicalement.

Jean François Ortolo

Vincent Verdon
2012-05-08 11:49:05 UTC
Permalink
Bonjour,
Post by Jean Francois Ortolo
Bonjour
J'aurais besoin de reconnaître la chaîne de caractère : "---" dans une
chaîne de caractères.
Je pense faire celà avec la fonction preg_match().
La chaîne $str ne contient jamais de caractère #.
if(preg_match("#^---$#", $str))
^ ne peut être que le premier caractère de l'expression
$ ne peut être que le dernier.

Ici, vous souhaitez vérifier (si je comprends bien, mais vous ne l'avez
pas spécifié clairement) que --- se trouve ou non dans $str.

Il faut encadrer l'expression rationnelle par des /
J'écrirais :
if(preg_match("/---/", $str))
tout simplement

S'il s'agit de vérifier que $str est exactement ---, alors :
if(preg_match("/^---$/", $str))
mais dans ce cas précis, autant tester simplement l'égalité de chaînes.
Post by Jean Francois Ortolo
Cette fonction va-t-elle rendre : true si ce qui est contenu dans $str,
est uniquement la chaîne : --- , et false autrement ?
La fonction renvoie le nombre de fois qu'elle trouve le motif décrit par
l'expression rationnelle. Comme preg_match s'arrête dès la première
occurrence trouvée, elle renvoie 0 ou 1. Voir preg_match_all pour
dénombrer toutes les occurrences.
Post by Jean Francois Ortolo
if(preg_match("#\-\-\-$#", $str))
Protéger ici - ne sert à rien, car ce symbole n'a pas de sens
particulier à cet endroit (en dehors de []).
Post by Jean Francois Ortolo
?
La fonction preg_match() , interprète-t-elle toujours son premier
paramètre, comme une regex, et en particulier dans ce cas, la première
syntaxe peut-elle convenir ?
Je ne comprends pas.

Amicalement, Vincent Verdon
Vincent Verdon
2012-05-08 11:55:26 UTC
Permalink
Post by Jean Francois Ortolo
Bonjour
J'aurais besoin de reconnaître la chaîne de caractère : "---" dans une
chaîne de caractères.
Je pense faire celà avec la fonction preg_match().
Le manuel PHP recommande, dans le cas où l'on cherche juste une chaîne
Post by Jean Francois Ortolo
N'utilisez pas preg_match() si vous voulez uniquement savoir si une chaîne est contenue dans une autre. Utilisez dans ce cas les fonctions strpos() ou strstr(), qui sont beaucoup plus rapides.
J'ai oublié de le dire dans mon précédant post.

Amicalement, Vincent Verdon
Loading...