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

je cherche à formatter un texte répondant à un certain nb de critères. Je ne sais pas du tout cmt m’y prendre. je vous donne un exemple ci dessous.
(précision: je ne vous demande pas de me le faire, mais de me donner des pistes :)) merci

note: cela fonctionne par lignes.

A B "posté par" C-D-E-A  F "le" G
H
I
...

A: entier de 1 à 5 chiffres
B: nombre d’espace indeterminé
“posté par”: chaine de caractère
C: chaine de x caractère (x inderminé)
-: tiret
D: Lettre
-: tiret
E: chaine de 3 caractères
-: tiret
A: cf plus haut
F: nombre d’espace indeterminé
"le: chaine de caractère
G: date au format “10/06/2005 13:29”
H: ligne vide
I: chaine de caractère sur plusieurs lignes
…: on recommence avec le meme principe (d’autres valeurs)

Exemple:

123     posté par titib-P-ABC-123  le "10/06/2005 13:29"

bla bla

bla bla
4566     posté par tutub-P-DEF-4566  le "10/06/2005 13:30"

blu blu

blu blu

Le but est donc de fournir par un formulaire un texte de ce type et qu’il le formate ensuite comme suit (par exemple)

<div id="1">
   <p><strong>titib-P-ABC-123</strong> (10/06/2005 13:29)</p>
   <em>bla bla<br /><br />bla bla</em>
</div>
<div id="2">
   <p><strong>tutub-P-DEF-4566</strong> (10/06/2005 13:30)</p>
   <em>blu blu<br /><br />blu blu</em>
</div>

En d’autre terme, qu’il me formatte le texte selon un certain nb de critères permettant de l’exploiter ultérieurement. (voir éventuellement l’inclure dans une base de donnée.

Merci d’avance.

titib

[0-9]{1,5}[[:blank:]]+posté par .-[a-zA-Z]-…-[0-9]{1,5} [[:blank:]]+ "le" [0-9]{1,2}/[0-9]{1,2}/[0-9]{,4} [0-9]{,2}:[0-9]{,2}
[[:blank:]]+\\n
(.
)+

Un truc comme ca nan? :stuck_out_tongue:

ca je peux comprendre, mais après, cmt tu récupère tes différentes variables pour les réinjecter ds ton formattage?

Avec les parenthèses bonhomme :slight_smile:

echo preg_replace(
  '/p(aaa|bbb)c/',
  '\$0 = $0, \$1 = $1',
  'paaac pbbbc'
);

bonhomme, j’adore l’idée :ane:

merci, je vais regarder ca… :slight_smile:

edit: tiens, tant que j’y suis, je peux te demander une chose: est-ce que c’est un problème (je parle au niveau “idéologique”) de stocker des balises html dans une bdd. Pcq j’ai un champ text dans lequel je pense stocker le résultat de mon remplacement. L’avantage si je stocke mes balises html, c’est qu’à l’affichage je n’ai qu’à faire un select et d’afficher le contenu. Si je stocke ca sous forme brute et que je fais l’opération a l’affichage, à chaque affichage je dois stockerl’affaire.
Autre solution, stocker ca sous forme de fichier externe. Mais est-ce que ca a un interet?

edit2: j’ai un peu du mal avec ton exemple :frowning: (rien à faire, les expressions régulières, chaque fois que je dois les utiliser je cafouille…)

http://fr.php.net/manual/fr/reference.pcre…tern.syntax.php

Miam.

Pas pigé pour l’autre question

tiens, tant que je te tiens (sans mauvais jeu de mot :heink:) une petite question qui n’a rien à voir avec ca:

j’ai une requete qui récupère le dernier enregistrement répondant à un critère:
SELECT * FROM table WHERE statut=1 ORDER BY id DESC LIMIT 1

pas de problème pour ca.

Maintenant, j’aimerai faire une requete qui récupères tous les enregistrement statut=1 SAUF celui là (en outre, tous les enregistrement, excepté le plus recent)

T’as une idée?

Tu refais la même requête en virant l’id ? (AND id != <truc>)

ca implique que je dois faire deux requete imbriquées

select * from table where statut='1' AND id!=(select `id` from table where statut=1 ORDER by `id` DESC LIMIT 1)

pas terrible comme solution

Sinon au pire tu l’ignores dans ta partie PHP ?

ca risque de bouffer plein de ressource… enfin, non en fait, mais ca fait un test en plus, et ca revient au meme pcq je dois également faire un select pour connaitre l’id en question. Donc autant tout faire dans ma requete mysql…

non?

edit: mysql ne gérant pas les requetes imbriqués dans ma version, je vais être obligé de faire deux requete et de faire un test…

merci de ton aide en tk

les regex les plus utilisées : http://benj.lespotos.com/index.php/?2004/1…/143-perl-regex

merci benj

une question que j’arrive pas à trouver (je continue à cherche en attendant): cmt faire n’importe quel caractère
j’aimerai récupérer une chaine de 1 à 5 nb [0-9]{1,5} suivit du signe “>” suvis d’une chaine de n caractères. Pas de problème pour le début mais je bloque pour la chaine inderminée (ca doit être une connerie)

edit: c bon, j’ai rien dit: .+ fera mon bonheur :stuck_out_tongue:

Le point (.) est ton ami.

/a.b/ matche aussi bien acb que abb etc. La seule chose que cela ne matche pas c’est \n (si tu mets pas l’option s)

(désolé de t’avoir dérangé, j’ai posté trop vite :D)

mais je maintient que c’est un truc obscure ces expressions régulières :pt1cable:

je commence à entrer ds le truc… ca rentre ds ma petite tete… doucement mais surement :sol:

a tiens, une petite question d’ordre général (encore une :p)

est-ce que ca change fondamenlement qqch entre ces deux solutions

<?php
if($test == 'ok')
{
   echo 'hello world';
}
?>

et

<?php
if($test == 'ok')
{
   ?>hello world<?php
}
?>

l’avantage de la deuxième c’est la lisibilité. Mais au niveau perf, ca change qqch?

La seconde te fait gagner à coup sûr 0.000001 secondes, vas y!

(…)

bon, d’accord. Donc niveau perf, ca change rien (ne nélgigeons jamais les fractions de secondes :ane:) mais par contre je la trouve plus lisible (ca évite de devoir mettre des doubles quote et autre trucs chiant type \’ pour afficher '.

Merci :slight_smile:

bon, je pense que je vais définitivment jeter mon ordi par la fenete. Je ne comprend absolument rien aux expressions régulière. J’ai lu je sais pas cb de site et rien n’y fais. Je comprends les exemples tous simples et dès que ca deviens un tant soit peu compliqué, je comprend plus rien… Comment ca se fait? :frowning:

Non, mais réfléchis quand même un peu plus …

<?php
echo 'aaaaaaaaaaaaa';
?>

sera toujours plus lent d’une décade que :

aaaaaaaaaaaaa

C’est logique : dans le premier cas tu stocke une chaîne de caractère de manière temporaire (mais tu la stocke), pour ensuite l’oublier avec echo. Donc oui : c’est plus lent en ce sens que les opérations ne sont pas les mêmes.

Dans le second cas tu envoies directement la chaîne au navigateur.