[PHP] Expression régulière - formatter un texte selon un certain nb d

donc mon choix est le bon :slight_smile:

Ce qui ne résoud pas mon irrémédiable problème des expressions régulières…

Rien à voir avec la choucroute, mais je fait du SQL de temps en temps et j’ai trouvé cette requête intéressante:

sauf que c’est peut-être un peu plus rapide et simple avec
SELECT max(id) FROM table WHERE statut=1
:wink:

merci :slight_smile: mais en réalité ce n’est pas ORDER BY id mais ORDER BY date et cette date est mise à jour régulièrement. Donc MAX est inutilisable.
Mais je garde l’idée en tete si le pb ce reproduit :slight_smile:

Ben le MAX d’une date, c’est le max d’une date? Je veux dire ça revient au même…

bla bla bla :smiley:

tu veux dire qu’on floode un peu? :smiley:
c’est vrai que ça a plus grand chose à voir avec les regexp. :ane:

quoi qu’il en soit, la requete telle que tu l’as écrites ne fonctionne pas… alors pour utiliser MAX il faut faire un GROUP BY ou je sais pas quoi et pi voili :heink:

edit: rien à voir, mais en tant que tel, si ca me permet de résoudre mes pb :stuck_out_tongue: (meme si ils sont autre)

et pour le reste, bah les regexp, je suis completement peaumé :??: en outre, j’arrive pas à faire ce que je veux…

Pourtant c’est super simple :slight_smile:

boh, si le mot-clef “max” existe en SQL, c’et qu’il doit-être utilisable :smiley:
group by, peut-être. dans les op de groupe, il y a aussi les sum(), les count(). je m’était amusé à faire de requête pas mal avec, ça, mais j’ai plus de sql maintenant, faut que tu fasse des essais…
ça te renvoie une erreur? ou une liste de valeurs?
group by statut, ou alors order by id( mais on perd un peu l’intérêt dans ce cas)

disons que ca renvoi des valeurs qui n’ont rien à voir… :bounce:

je reviens à la charge avec mes expression régulières.

Qq’un peut il me dire pq parfois on utilise / en début d’expression et parfois ^
^est sencé etre le début et $ la fin
mais j’ai des expression type

$string = 'April 1, 2003';
$pattern = '[B]/[/B](\w+) (\d+), (\d+)[B]/i[/B]';
$replacement = '$3 <br> $1 <br> $2';
echo preg_replace($pattern, $replacement, $string);

si je remplace le / par ^et le /i par $ ca marche pas
et pq /i à la fin et pas / (qui donne le meme resultat)…
(source php.nert)

Mais? tu as lu le tutorial sur le site de PHP?

Les expressions rationnelles PERL sont spéciales, elles sont besoin d’un délimiteur de début fin et de fin.

Ex: /aaa/
@aaa@
<aaa>

Après le délimiteur de fin tu peux préciser les options.

Lis bien la doc, c’est pas franchement compliqué.

mon esprit inférieur doit avoir un problème. Pcq je te jure que j’ai lu cette doc. Et rien n’y fait. Ca ne rentre pas.
Enfin, je m’y replonge…

edit, une petite question: j’ai une chaine qui fait plusieurs lignes? qsq je dois utiliser (étant donné que le pts ne joue pas sur pls lignes?)

aidez moi…

Tjs par rapport au message de base:

j’ai réussi à faire ca:

$patern = '/([0-9]{1,5}\s+)(posté par\s+)(\w+)-(\w+)-(\d+)(\s+le\s)(\d+\/\d+\/\d+\s+)(\d+:\d+\s)(GMT)(\n\n.*)(\w+)/i';

qui filtre ceci

$string = '555  posté par  XXX-XX-555  le 01/01/2005 10:20 GMT

XXX
555  posté par  XXX-XX-555  le 01/01/2005 10:20 GMT

XXX';

de la manière suivante:

$replacement = '$1 - $3-$4-$5 ($7 - $8) <br />';

echo preg_replace($pattern, $replacement, $string);

qui retourne:

555 - XXX-XX-555 (01/01/2005 - 10:20 )
555 - XXX-XX-555 (01/01/2005 - 10:20 ) 

Jusque là tout va bien.

Le problème (énoncé dans le post précédent) est que le XXX est sur plusieur ligne…

Que faire?

Merci d’avance,

titib

Déjà :

$patern = ‘@([0-9]{1,5})\s+posté par\s+(\w+)-(\w+)-(\d+)\s+le\s(\d+/\d+/\d+)\s+(\d+:\d+)\sGMT\n\n.*(\w+)@i’;

Ce qui évite un surplein de parenthèses (Posté le, tu veux vraiment matcher ça?)

Ensuite, tu as les options de PCRE qui passent après le délimiteur de fin (c’est le but de ces fameux délimiteurs : ça vient de Perl, en dedans tu ne mets pas les expressions dans une chaîne, c’est directement l’expression régulière) : celle que tu veux, c’est s.

/a.*a/si

matche

a
p
a

Et tu peux l’appliquer de manière interne : /a((?s).*)a/i.

Note bien que j’ai réécris ton expression avec @ comme délimiteur: tu peux mettre ce que tu veux tant que ça compile

quelle différence entre @ et / comme délimitateur?

autre chose, tu me demande si je veux vraiment matcher “posté le”, mais pq ne le voudrais-je pas? C’est un texte qui est la comme une cst, pq ne pas le matcher?

merci beaucoup en tk

euh… petite chose: je ne vois pas cmt ca fct.

Pcq si je reprend ton exemple:

$string = 'a
p
a';
echo preg_replace('/a.*a/si',?????,$string);

je dois mettre quoi dans ???

pcq il ne me trouve pas les $1, $2…

j’ai le meme pb appliqué à mon histoire :S

Quand je dis matcher, je veux dire "capturer". Désolé.

En gros les parenthèses permettent de capturer des sous chaînes, et là c’est pas trop utile.

Pour ce qui est de @ et /, y a une différence: quand tu utilises @ tu n’as pas besoin de protéger / :slight_smile: (ggenre /\// == @/@), mais tu pourrais très bien utiliser < et >, # et #, _ et _, etc.

En Perl (ou en javascript en fait), tu écris l’expression comme ça :

if ( x.match(/a.*/) )
…;

où x est une chaîne : ici / est un délimiteur. C’est comme pour les chaînes : ça permet de dire où commence et où finit l’expression rationnelle…

(c’est logique : délimiteur)

mais pour récupérer ma chaine de plusieurs lignes, je fais cmt?

Les $n correspondent aux parenthèses.

Si y a pas de parenthèses, $n ne marche pas. C’est pour capturer une expression que l’on utilise les parenthèses (en plus de forcer la priorité).