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

ca j’avais compris. Mais ca ne résoud pas mon problème.

exemple:

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

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

C
D';
$pattern = '/([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+)/si';
$replacement = '$1 - $3-$4-$5 ($7 - $8) <br /> $11 <hr>';
echo preg_replace($pattern, $replacement, $string);

m’affiche

555 - XXX-XX-555 (01/01/2005 - 10:20 )
A
----------------------------
B 555 - XXX-XX-555 (01/01/2005 - 10:20 )
C
----------------------------
D

alors que j’aimerai avoir

555 - XXX-XX-555 (01/01/2005 - 10:20 )
A
B
----------------------------
555 - XXX-XX-555 (01/01/2005 - 10:20 )
C
D

comment faire?

merci encore d’avance,

titib

\w+ c’est pour les mots.
\n c’est un caractère blanc. Alors ne cherche même pas à capturer une séquence contenant des caractères blancs avec une séquence capturant des caractères de mots, hé :o

c’est quoi que je dois utiliser alors?

Soit [\w\n]+, soit ., etc. Jusqu’à ce que cela te convienne.

Désolé d’intervenir mais je vais passer pour un emm… :neutre:

Je pense qu’il faudrait séparer les différentes questions

1 - Les expressions régulières

2 - Les requetes SQL

Maintenant, je poserais le problème à l’envers

Quels sont les éléments en ta possession ?
Quel est le résultat recherché ?

Est un affichage d’une base de données avec une mise en forme ? ou
est un formulaire pour remplir une base de données ?

Dans ton texte tu veux commencer par mettre 3 caractères, dans quel but précis ?

Maintenant concernant les requêtes SQL je pense qu’en mettant … ORDER BY date limit 1,500

Extrait du site www.nexen.net Liens vers l’extraction

La clause LIMIT peut être utilisée pour limiter le nombre d'enregistrements retournés par la commande SELECT . LIMIT accepte un ou deux arguments numériques. Ces arguments doivent être des entiers constants.Avec un argument, la valeur spécifie le nombre de lignes à retourner depuis le début du jeu de résultat. Si deux arguments sont donnés, le premier indique le décalage du premier enregistrement à retourner, le second donne le nombre maximum d'enregistrement à retourner. Le décalage du premier enregistrement est 0 (pas 1) : 
Pour être compatible avec PostgreSQL, MySQL supporte aussi la syntaxe : LIMIT row_count OFFSET offset . 


mysql> SELECT * FROM table LIMIT 5,10;  # Retourne les enregistrements 6 à 15

Mon problème est un formulaire html qui doit formater une chaine (textarea) de la manière suivante puis l’insérer dans une table mysql (insert)

je rentre par exemple le texte suivant:

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

et je veux que soit inséré dans ma db le texte suivant

<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>

Voila le problème concrètement.

personne n’a d’idée?

Tu sais, si les regexp ne marche pas, ça ne t’empêche pas d’analyser via php (un script de reconnaissance, avec les fonctions ctype_*) ta chaîne hein…

c’est pas qu’elle ne marchent pas, c’est que je n’arrive pas à faire ce que je veux… Et c’est pas faute d’essayer :S

Tout n’est pas reconnaissable par une expression rationnelle.

à bon? je suis étonné là… Je serai pas venu pour rien :slight_smile:

et en l’occurence, tu dis que ma chaine n’est pas reconnaissable…?

J’en sais rien. Je dis juste que les regexp ne sont pas la solution à tous les problèmes.

Mais si toi tu ne sais pas, qui va savoir?

Si tu arrive à coller Sans-Nom, tu va forcément limiter le nombre d’interlocuteurs!
Juste pour moi, les expressions rationnelles, c’est une analyse lexicale, et pour faire selon les règles de l’art, il faut ajouter une couche d’analyse syntaxique (des grammaiers) et une analyse sémantique (du code ad-hoc)

titib> en théorie des langages, il est bien connu que a{n}b{n} ne peut pas être reconnu par un automate, et qu’il ne s’agit pas d’un langage rationnel. Un langage rationnel peut normalement se transcrire en une expression rationnel. Donc, à partir de là un constat s’impose : les expressions régulières ne permettent pas de tout solutionner.

Ce que te propose deltree, c’est de faire de l’analyse lexicale pour couper tes chaîne à insérer en différentes parties, et ensuite de passer un analyseur syntaxique (un automate à pile, en somme) pour justement analyser la chaîne.

(mais bon, je pige pas pourquoi tu veux parser cette chaîne, dans quelle but ? N’as tu pas moyen d’avoir une chaîne plus facile à analyser? )

j’ai pas vraiment tout compris à votre charabiat à tous les deux, mais bon :confused:

le but de l’opération est que l’utilateur face un copier/coller d’une page web qui se structure comme donné précédement), et de récupérer les différentes informations, et, soit les remettres directement en forme (comme montré ds le post en page 2) soit en les intégrant à une db.

L’autre solution étant que l’utilisateur décompose lui meme les données. Mais si une page comptient une 20 aines de lignes de ce genre, cela fait une vingtaine de fois 3 (titib-P-ABC-123, 10/06/2005 13:29, bla bla<br /><br />bla bla) copier/coller… soit 60 copier/coller au lieu d’un seul…

Tu comprend dès lors l’interet de mon script.

La théorie des langages c’est un truc costaud qu’on voit en études d’informatiques, entre autre pour écrire des compilateurs, interpréteurs, ou tout autre parser, et ce de façon scientifique. On peut étudier ces théorie avec une approche “mathématique” et démontrer qu’un automate (en gros l’algo de découpage) est réalisable ou pas. pour moi, c’est loin, et je n’ai retenu que le strict minimum pour écrire un parser de a à z, selon les règles de l’art.

  1. définir les mots du langage sous forme d’un ensemble L. exemple informel L={"{","}",(,),[,],"[a-z][0-9]*"} pour un langage pseudo-C, (et bourré de fautes sur les expressions rationnelles).
    cette étape te permet d’écrire ton analyseur lexical indépendamment de ce que tu en fera, tu te contente de lire des “mots” qui correspondent aux ids, opérateurs, délimiteurs…
    on peut utiliser flex pour faire cette analyse, ou les expressions régulières que tu utilise, ou faire du code manuel pour découper tes chaines de façon basique.

  2. Définir la gramaire du langage, avec un ensemble de règle formalisées, et qui finissent sur des mots du langage défini précédemment.
    exemple:
    S-> fonctions
    fonctions->fonction fonctions
    fonction->type id(argumentsdecl){instructions}
    instructions->instruction instructions
    instruction->id(arguments);|expression;
    expression-> (etc; etc; etc.)

tu peux écrire cette partie avec du yacc, bison, ou avec des fonctions qui simulent les appels de règles (il y a une méthode pour ça mais ce serais un peu long ici)
petite note: plus tu fait un analyse syntaxique poussée, plus simple sera ton analyse lexicale et inversement. Il n’y a donc pas une solution unique à un problème donné.

  1. couche sémantique
    sur chaque appel de règle tu contrôle le typage, la cohérence, bref, la sémantique :slight_smile: ,et soit tu rempli un arbre de données correspondant à tes règles, dans le but de le réutiliser plus tard, soit tu lance directement ce que tu a à faire (interprétation par exemple).

:hello:
Tout ça c’est un peu général, mais c’est un des rares domaines de l’informatique très formalisé, et qui ne laisse aucune place au hasard si on le fait dans les règles de l’art. Donc si ça peut s’adapter à ton problème.

Dans ton cas, apparamment tu cherche à parser du HTML? (désolé je n’ai pas tout lu), Dans ce cas, tu pourrais utiliser un parser XML, ils sont déjà écris, ça te donne un arbre DOM (Document Object Model) correspondant à l’arbre de données dont je parle dans la partie 3)

Tout ça pour dire: les expression régulière correspondent donc à la partie lexicale d’un parser, et quand on doit parser des choses complexes, il faut passer aux grammaires, ne serais-ce que pour le formaliser sur papier.

je pense qu’il faudrait que j’achete un gros bouquin ou que je fasse des études là dedant pour comprendre le charabiat que tu me sors.
Désolé si je te vexe, ce n’est pas le but, mais je n’ai strictement rien compris. Sans doute ma tite tête qui est pas très efficace…

disons que moi je n’ai appris à coder (enfin, c’est prétencieux ca…) uniquement sur des sites, forums (merci Sans-Nom :p), et autre tutos… Donc la théorie j’en ai peu voir pas du tout…

concretement, dans ce cas précis (ce n’est pas du html, c’est un copier/coller d’une page, ce qui sort du texte brut), tu utiliserais quel type de technique? (que je sache vers quoi me diriger)?

Des fonctions à la con. (CQFD)

La théorie des langages est certes peut être pas si simple, mais les grammaires et l’analyse lexicale, c’est pas si complexe à piger (mais je comprend que tu ne veuilles pas, hein) puisque principalement tu appliques un algo tout bête (LL(1), LR(1), LALR(1), LR(0), etc)

Mais bon, en PHP faire un lexer + parser pour ça, c’est éxagérer :slight_smile: tu vas prendre plus de temps à l’écrire, qu’à analyser, d’où : utilise des fonctions, découpe tes chaînes à la main.

C’est tout.

Sur du papier, analyse ta chaîne, à quoi elle ressemble et pouf !

c’est pas que je veux pas, c’est que je comprend pas (esprit simple :frowning: )

lorsque tu me dis d’utiliser des fct? tu me parles de quel genre de fct? Analyser ma chaine “a la main”, ca veut dire quoi concretement?