regexp

regexp - PHP - Programmation

Marsh Posté le 03-01-2009 à 23:23:23    

Salut.
je bloque sur un truc tout con.
j'ouvre un fichier texte en php puis avec une expression regulière je cherche les lignes qui se terminent par le motif gh.
 

Code :
  1. while ($ligne=fgets($fp))
  2. {
  3.  if (ereg("gh$", $ligne))
  4.  echo "<br>:".$ligne;
  5. }


 
sauf que ce truc tout con ne marche pas.
si j'enlève le $ il me donne bien les lignes qui comportent gh mais si je le met il ne me trouve rien alors qu'il y en a.
 
ça peut venir de quoi svp  :cry:

Reply

Marsh Posté le 03-01-2009 à 23:23:23   

Reply

Marsh Posté le 03-01-2009 à 23:30:02    

Code :
  1. function ends_with_gh($string) {
  2.   return strrpos($string, 'gh') == strlen($string) - 1;
  3. }
  4. $lines_ending_with_gh = array_filter(file($path), 'ends_with_gh');
 

(Non testé.)

 

Edit: mon truc te crée un tableau. Si t'as juste besoin d'itérer une fois, prend juste en compte la fonction. En regex, ça donnerait /gh$/ avec preg_match (je connais pas ereg). Mais en termes de perfs je suppose qu'il est préférable de se passer des regexp quand c'est possible.


Message édité par sielfried le 04-01-2009 à 14:46:26

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 03-01-2009 à 23:36:10    

cool mais ça va aller car.
le fait que ça termine par gh n'est qu'un tout petit bout de ce que je dois intégrer dans ma regexp
mais là je bloque sur l'utilisation du $ qui correspond normallement à fin de ligne.
merci à toi néanmoins  :jap:

 

-edit- il faut nécessairement que j'utilise les regexp et j'itere sur un tas de lignes d'un fichier texte


Message édité par x-ben le 03-01-2009 à 23:37:11
Reply

Marsh Posté le 03-01-2009 à 23:42:01    

Utilise preg_match avec /gh$/. ereg est fortement déconseillée.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 03-01-2009 à 23:48:03    

sielfried a écrit :

Utilise preg_match avec /gh$/. ereg est fortement déconseillée.


ok ça marche.
merci beaucoup  ;)  
tu n'aurais pas idée de la raison pour laquelle ça ne marche pas avec ereg? (alors qu'à priori ça devrait)

Reply

Marsh Posté le 03-01-2009 à 23:58:40    

bon en vérité ça se complique un peu.
ma question était pour parvenir à isoler un nombre se trouvant en fin de ligne genre:
10- - [0000] ".php blabla.0" test 123
23- - [123] "blabal " test2 25
 
je veux récupérer 123 et 25 (pour en faire la somme en l'occurence).

Reply

Marsh Posté le 04-01-2009 à 00:20:20    

/\d+$/
 
Ou /(?<=\s+)\d+$/ s'il doit y avoir un espace avant.


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-01-2009 à 00:32:26    

je ne pige pas ta syntaxe.
en attendant j'ai fais ça: / [0-9]*$/  (il y a un espace entre / et [ )et ça semble fonctionner

Reply

Marsh Posté le 04-01-2009 à 00:35:28    

\d c'est pareil que [0-9].

 

+ c'est mieux que * dans ton cas, tu veux au moins un chiffre.

 

\s c'est n'importe quel espace (ça peut être une tabulation aussi par exemple), \s+ c'est donc n'importe quelle suite de caractères d'espacement, ça permet d'être tranquille là-dessus, après ça dépend si ton format est strict ou pas.

 

Enfin, encadrer de (?<=) l'espace permet de ne pas l'inclure dans le résultat du match. Ton truc va matcher le nombre avec l'espace avant, alors que ma version ne matchera que le nombre.


Message édité par sielfried le 04-01-2009 à 00:36:13

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-01-2009 à 00:49:31    

j'ai testé tes 2 versions
la 1ere c'est ok je trouve le mème resultat que moi
par contre la 2eme il doit y a voir une boulette
 
if (preg_match(/(?<=\s+)\d+$/", $ligne, $res))
->
Parse error: syntax error, unexpected '/', expecting ')' in /var/www/regexp.php on line 53
 
j'ai corrigé comme ça:
 
if (preg_match("/(?<=\s+)\d+$/", $ligne, $res))
->
Warning: preg_match() [function.preg-match]: Compilation failed: lookbehind assertion is not fixed length at offset 7 in /var/www/regexp.php on line 53
 
en attendant je te remercie pour les ptits trucs bien pratique que je viens d'apprendre  [:athome]

Message cité 1 fois
Message édité par x-ben le 04-01-2009 à 00:51:24
Reply

Marsh Posté le 04-01-2009 à 00:49:31   

Reply

Marsh Posté le 04-01-2009 à 01:43:57    

x-ben a écrit :

j'ai testé tes 2 versions
la 1ere c'est ok je trouve le mème resultat que moi
par contre la 2eme il doit y a voir une boulette
 
if (preg_match(/(?<=\s+)\d+$/", $ligne, $res))
->
Parse error: syntax error, unexpected '/', expecting ')' in /var/www/regexp.php on line 53


 
Ah bah évidemment, si t'ouvres pas la chaîne...
 

Citation :


j'ai corrigé comme ça:
 
if (preg_match("/(?<=\s+)\d+$/", $ligne, $res))
->
Warning: preg_match() [function.preg-match]: Compilation failed: lookbehind assertion is not fixed length at offset 7 in /var/www/regexp.php on line 53
 
en attendant je te remercie pour les ptits trucs bien pratique que je viens d'apprendre  [:athome]


 
Effectivement, je me fais toujours avoir. Bon, bah (?<=\s)\d+$, dans ce cas. Faut qu'il n'y ait qu'un seul caractère d'espacement avant, dans ce cas.
 
Sinon, /\s+(\d+)$/ et tu récupères $res[1].


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 04-01-2009 à 16:37:47    

les 2 sont ok  [:the fonz]  
 
merci et dédrap surtout pas  :hello:

Reply

Marsh Posté le 09-01-2009 à 23:50:03    

Salut,
j'ai un nouveau ptit prob.
il s'agit de traiter de remplacer des balises dans un texte.
 
ex: les regexp c'est *supayr*  
doit devenir: les regexp c'est <b>super</b>
je suis parti dans ce sens:
 

Code :
  1. preg_replace(    '/\*.*\*/'    ,     '/<b>.\*</b>'     , $texte);


le prob est que je perd le texte entre les <b> et </b>
ça va me donner: les regexp c'est <b></b>
 
qqun pour m'aiguiller svp?

Reply

Marsh Posté le 10-01-2009 à 11:21:39    

http://fr.php.net/manual/fr/function.preg-replace.php
 
Regarde la doc du paramètre 'replacement' et les exemples.  
 
(Il y a autre chose qui ne va pas, mais chaque chose en son temps...)


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 10-01-2009 à 13:39:15    

sielfried a écrit :

http://fr.php.net/manual/fr/function.preg-replace.php
 
Regarde la doc du paramètre 'replacement' et les exemples.  
 
(Il y a autre chose qui ne va pas, mais chaque chose en son temps...)


 
je l'ai lu dans tout les sens celle là ;)
il y a qq exemples sur lesquels je ne percute pas vraiment mais en attendant je m'en suis sorti comme ça:

Code :
  1. $patterns[0] = '/\$(.+?)\$/';
  2. $replacements[0] = '<i>$1</i>';
  3. $new_texte = preg_replace($patterns, $replacements, $texte);


(je procède par tableau car j'ai d'autres balises à traiter en réalité et ça fait plus propre)
En effet il fallait que je m'attarde sur le paramètre 'replacement'
 
L'autre truc qui n'allait pas dans mon exemple est sans doute l'utilisation de .* au lieu de .+? c'est ça  [:autobot]

Reply

Marsh Posté le 10-01-2009 à 22:07:13    

juste pour dire que ton premier problème avec $ venait du fait que la ligne retournée par fgets() contient le retour à la ligne final, il fallait donc mettre "gh\n$" ou faire un rtrim() avant

Reply

Marsh Posté le 10-01-2009 à 23:06:33    

Cortexd a écrit :

juste pour dire que ton premier problème avec $ venait du fait que la ligne retournée par fgets() contient le retour à la ligne final, il fallait donc mettre "gh\n$" ou faire un rtrim() avant


ah ok.
mais pkoi on n'a pas le problème avec preg match alors [:at war with emo]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed