definition d'un preg_match

WRInaute discret
Bonjour,

Juste une petit bouteille à la mer, car je suis en train de m'arracher les cheveux sur une fonction preg_match que je n'arrive pas à paramétrer.

J'ai tout simplement besoin de savoir si une date du type jj/mm/aaaa se trouve dans une chaine spécifique.

J'ai le début :

Code:
$chaine = "abcd [xx/xx/xxxx] efgh";

Après je n'arrive à rien ! :mrgreen:

Si quelqu'un peut m'aider... Merci !
 
WRInaute impliqué
$subject = "ta chaine";
$pattern = '/^([0-9]{2}\/[0-9]{2}\/[0-9]{4})/';
preg_match($pattern, $subject, $matches);
if(strstr($matches,"/")){
echo `ya la date'; }
else { echo 'ya pas la date'; }
 
WRInaute discret
heu...

C'est à dire que...

Waw... !

Ma fierté me crie : "Prends ça dans ta tronche, camarade ! Vite, propre et sans bavure ! T'as encore plein de trucs à apprendre en php !"

C'est encore mieux que ce que je cherchais ! :D

Merci beaucoup !
 
WRInaute occasionnel
correiaj a dit:
$subject = "ta chaine";
$pattern = '/^([0-9]{2}\/[0-9]{2}\/[0-9]{4})/';
preg_match($pattern, $subject, $matches);
if(strstr($matches,"/")){
echo `ya la date'; }
else { echo 'ya pas la date'; }

Si je ne m'abuse, cela ne fonctionnera que si la chaine commence par la date. Il vaut mieux faire ainsi :
Code:
$subject = 'on est le 27/10/2005 a 17h09';
$pattern = '/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/';
if (preg_match($pattern, $subject, $match)) {
  echo 'ya la date<br>';
  echo "match : $match[0]" ;
} else {
  echo 'ya pas la date';
}
 
WRInaute discret
Alors, j'ai testé avec ça :
Code:
$chaine = " bla bla (01/05/2005) bla bla [22/06/2005] et bla bla (13/07/2005)";

	echo "1ere methode<br>";
	$pattern = '/^([0-9]{2}\/[0-9]{2}\/[0-9]{4})/';
	preg_match($pattern, $chaine, $matches);
	if(strstr($matches,"/")){
	echo 'ya la date'; }
	else { echo 'ya pas la date'; }

echo "<br><br>";

	echo "2eme methode<br>";
	$pattern = '/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/';
	if (preg_match($pattern, $chaine, $matched)) {
		echo 'ya la date<br>';
		echo "match : $matched[0]" ;
	} else {
		echo 'ya pas la date';
	}

J'obtiens :

1ere methode
ya pas la date

2eme methode
ya la date
match : 01/05/2005

Donc la 1ere semble ne pas fonctionner.
La 2eme fonctionne, mais je voudrais appeler uniquement la date entre les []. Les autres ne m'interessent pas. J'ai tenté de modifier le $pattern, mais sans succès.

De quelle façon dois-je le modifier ?
 
WRInaute occasionnel
faut "escaper" les crochets, ça donne pour le pattern :
Code:
$pattern = '/\[([0-9]{2}\/[0-9]{2}\/[0-9]{4})\]/';

pour avoir la date dans une variable, dans ce cas, faudra lire $matched[1] et non $matched[0] sinon tu récupères les crochets avec.
dans ton exemple, ça donne :
$matched[0] = "[22/06/2005]"
et
$matched[1] = "22/06/2005"
 
WRInaute discret
Génial ! ça marche nikel !

Encore merci !

J'ai plus qu'à trouver une page qui explique clairement comment paramétrer cette fonction, histoire quand meme de pouvoir comprendre pourquoi ça marche ;)
 
WRInaute discret
Bonjour,

J'aurais une petite question moi aussi... :)

Et si on veut TOUTES les dates de la chaine ?

En fait j'en ai eu besoin pour récupérer tous les liens d'une page HTML pour faire une sorte de moteur, et je me suis fait une petite fonction mais elle est un peu lourde.. alors je me demandais si ....

Merci
 
WRInaute discret
Je repost sur ce fil car c'est le meme genre de question :

J'ai cherché une doc sur ces expressions bizarres genre [0-9], [^-] ou [.*] mais je ne trouve rien de "pédagogique".

Vous auriez une adresse à me conseiller ?

Le pire c'est que c'est pour des problèmes mineurs :
maintenant, je dois utiliser un preg_replace pour remplacer tous les ? dont les caractères précédents et suivants sont des lettres alphabétiques.
Code:
abc?edf => transformé en abcXXdef
[espace]?[espace] => rien
[espace]?def => rien

Merci du coup de main !


Edité **************

Oops, j'avais pas vu les post supplémentaires ! Je vais assayer de me débrouiller avec ça
 
WRInaute occasionnel
bozobuzu a dit:
maintenant, je dois utiliser un preg_replace pour remplacer tous les ? dont les caractères précédents et suivants sont des lettres alphabétiques.
abc?edf => transformé en abcXXdef
[espace]?[espace] => rien
[espace]?def => rien

Code:
$string = 'abc?edf' ;
$pattern = '/([a-z])\?([a-z])/i';
$replacement = '$1XX$2';
echo preg_replace($pattern, $replacement, $string);

Je ne peux par contre pas t'orienter sur un guide "pédagogique" par contre, ça fait juste suffisament d'années que je fais du perl pour parler assez bien le regexp :)

Mais je te conseille le Regex Coach pour tester tes regexp plus facilement.
 
WRInaute discret
Je vais regarder ça. Mais ça commence fort, il semble considérer le ? comme un caractere joker.

Alors comment je la fait mon expression, moi ?? :mrgreen:

En attendant, je me répète : si quelqu'un peut me dire comment remplacer dans une chaine tous les *?* (* étant n'importe quel caractere de l'alphabet sauf l'espace) par une autre expression type *XX*

Merci
 
WRInaute discret
Salut,

Il me semble que ChezThierry T'a donné la solution non ?
pour le "?" il faut l'échapper : "\?" comme ChezThierry te l'a montré

:)
 
WRInaute discret
siddhy a dit:
Salut,

Il me semble que ChezThierry T'a donné la solution non ?
pour le "?" il faut l'échapper : "\?" comme ChezThierry te l'a montré

:)

Oulala.. je délire complètement, moi...

Je l'avait meme pas vu ! 2X dans le meme post, faut que j'arrete de coder jusqu'à 5h du mat, moi, ça me réussit pas. En tout cas, j'ai plus 20 ans ;)
 
WRInaute occasionnel
Apparement ici c'est le topic des pros du preg_match :) je vais donc poster ici !

Donc j'ai ce morceau de code :
Code:
preg_match_all('/<span>(.*)<\/span>/i', $file, $ArraySub, PREG_SET_ORDER); 
foreach ($ArraySub as $match) { 
   echo strip_tags($match[1]).'<br><br>'; 
}
Qui me pose quelques pobleme. Il marche, mise a part une chose :
Lorsque dans le $file il y a un saut de ligne entre le <span> et le </span>, il ne reconnait pas l'expression reguliere.

Exemple :
ici il me sort bien "c'est bien ce texte que je veux" :
<span>c'est bien ce <br>texte<br><br> que je veux</span>

mais pas ici :
<span>c'est bien ce <br>
texte <br>
<br>
que je veux</span>

Quelqu'un aurait-il la solution ?

Merci d'avance
 
Discussions similaires
Haut