pour reprendre la problemeatique :
(copier coller de mon post sur developpez.net)
j'ai créé, pour une action de BTS, un moteur de template.
une de ses fonctionnalitées est de substituer un "bloque" par "autre
chose" (pas important ici)
pour substituer ce block, je doit tout d'abord l'extraire, pour ce
faire, je fait un preg_match() qui me retourne mon block, je fait mes
traitemeznts, puis je fait un str_replace() pour substituer le nouveuax
block.
mon pb se situe au niveau du preg_match :
cette fonction accepte trois parametre.
L'un d'eux est une expression reguliere.
cette expression est :
"/<li>.*?\[ *testBDD *; *block *= *li *\].*<\/li>/sU"
pour simplifier, on peut la noter :
"/<li>.*?.*<\/li>/sU"
mon pb :
au lieu de prendre le dernier <li> disponible, elle prend le
premier...cad :
Code:
<li> ne pas me prendre mias quand meme pris </li>
<li> je veut cette partie </li>
<li> ne pas me prendre et ca marche </li>
donnera :
Code:
<li> ne pas me prendre mias quand meme pris </li>
<li> je veut cette partie </li>
hansap
Messages postés23Date d'inscriptionvendredi 10 juin 2005StatutMembreDernière intervention19 octobre 2005 18 oct. 2005 à 18:00
conanit tu les moteur de template?
je veut en faire un moi meme.
cad :
tu as deux parties:
une page HTML (purement fixe)
un script PHP (purement dynamique)
a partir du script qui se debrouille pour recupérer des infos (requetes ou autre) tu fusionne les données dand ton template.
cad :
la ou tu n'avait qu'une balise [balise; client.nom]
tu auras tous les noms de tes clients...
dans mon pb :
j'ai une balise [balise; block = li] suivit de balsies du type [balise; client .nom]
pourquoi la rpemiere. car la ou il n'y avait qu'une seule balise, vont apparaitre plein de nom de client... faut bien savoir par ou les separer... et bien la le separateur (le "block") sera un <li>...</li>
donc, a partir de tout mon fichier HTML chargé dans une varible chaine de caractere, je veut pouvoir retrouver <li> bla bla bla </li>
L'ordre est tel que <var>$matches[0]</var> est un tableau qui
contient les résultats qui satisfont le masque
complet, <var>$matches[1]</var> est un tableau qui contient les
résultats qui satisfont la première
parenthèse capturante, etc.
[salut.html clique moi]
partie 1 : [salut.html
partie 2 : clique moi
partie 3 : ]
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_Anthomicro
Messages postés9433Date d'inscriptionmardi 9 octobre 2001StatutMembreDernière intervention13 avril 20078 18 oct. 2005 à 18:40
Merci je sais ce qu'est un moteur de template, et malgré ton post sur
developpez.com je n'en comprends pas vraiment plus... m'enfin bon tant
pis. Bon courage.
hansap
Messages postés23Date d'inscriptionvendredi 10 juin 2005StatutMembreDernière intervention19 octobre 2005 19 oct. 2005 à 09:09
bonjours J_G, j'ai lut avec une (tres) grande attention tout ce que tu m'a dit, mais avant tout, je vait essayer d'exposer un pb tres simple :
je fait :
<?
$chaine = "
<li> ne pas me prendre mais quand meme pris </li>
<li> je veut cette partie </li>
<li> ne pas me prendre et ca marche </li> ";
preg_match("/<li>.*je veut cette partie.*<\/li>/sU", $chaine, $occurence);
var_dump($occurence);
?>
et j'obtient :
<!--StartFragment -->array(1) { [0]=> string(86) "<li> ne pas me prendre mias quand meme pris </li> <li> je veut cette partie </li>" }
donc, la ou je ne devrait avoir que la ligne du milieu, j'aen ai deux...
bug de preg_match?
Je pense donc etre en presence d'un bug... je suis en php 4.2.3, qi kkun pouvait essayer de reproduire ce petiti code pour moi...
merci anthomicro, j'ai ete un peu sec, dsl...
et coucou747 (ainsi que J_G) pensez vous que ce pourrait etre faisable de facon claire et conscise avec XSLT?
je presente ca pour une action BTS, et la presentation doit primer sur l'optimisation, je pense...
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 19 oct. 2005 à 09:51
Hello,
je peux ?
Hansap, je ne comprends pas moin non plus complètement. Tu as 3 balises
<li>, et tu veux le contenu de la seconde, dans ton dernier
exemple...?
Quelle est la règle pour ton moteur ? Tu dois avoir des spécs, je suppose, donne les.
Ensuite...html, ça vient du sgml. xml aussi. xhtml aussi, donc.
Bref, la seule différence notable entre le html, et xml, c'est qu'html n'est pas sensible à la casse, xml si.
Mais la structure es la même.
Donc, quand je lis que xslt peut t'apporter une solution...je soutiens :-) Mais tu n'as peut-être pas besoin de passer par xslt.
En fait ce qui devrait t'intéresser, c'est XPath. Tu peux 'en servir
dans un fichier xsl...c'est pratique, et efficace. TU accèdes au noeud
que tu veux, à sa valeur, attribut, tu peux boucler sur tes noeuds
etc...si tu veux le 3ème <li> sur une liste de deux, ça va te
prendre 1 ligne en XPath.
Et en plus, tu peux 'en servir directement avec php.
Cherche XPath, XSLT, sur le web, et XPath sur php.net aussi.
hansap
Messages postés23Date d'inscriptionvendredi 10 juin 2005StatutMembreDernière intervention19 octobre 2005 19 oct. 2005 à 10:01
JG :
Pour isoler le contenu des <li> ici </li> :
$matches= array();
preg_match_all("@<li>((\w|\s)*)</li>@", $matches, $text_html);
echo nl2br(print_r($matches,true));
effectivement, ca marche, cependant, tu travail sur un char unique : (\w|\s)* qui se repete tantque pas </li> (bizarre, ici y'a pas a echapper le "/"... un effet des "@"?? )
je pourrait essayer de fonctionner avec qqchose du genre de ((?!maChaine)|\w|\s) mais jusqu'a present... ca marche pas...
merci de ta piste...
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 19 oct. 2005 à 10:29
Un prof qui ne comprend rien est un prof épâté (quand ça marche, évidemment, lol).
Bon...
Donne un exemple de chaine (tes vraies données cette fois, mais sans
les variables hein, mets en dur, ce sera plus simple), et ton
expression régulière
(enfin ça, ça va, on l'a ici). On va faire des tests :-) Parce que j'ai
vraiment du mal à me rendre compte dans tes simplification ce que tu
cherches.