probleme avec preg_replace

Petit nouveau ! | 4 Messages

07 avr. 2012, 03:06

bonjour, je suis en ce moment en train d'aprendre à me servir du html5 et je traite mon html pour passer du 4.1 au 5. et j'ai un gros probleme avec preg_replace, si quelqu'un a une idée...
<?php

// donc je cré un article, avec un entete et 2sections, une pour les paragraphes et une pour les annotations

$content = '
		<article>

			<header>
				<h4>LE VIEIL HOMME ET LA MER, (<i>extrait</i>)</h4>
			</header>

			<section>
				<p>Il était une fois un vieil homme, tout seul dans son bateau, qui pêchait au milieu du Gulf Stream. En quatre-vingt-quatre jours, il n\'avait pas pris un poisson. Les quarante premiers jours, un jeune garçon l\'accompagna ; mais au bout de ce temps, les parents du jeune garçon déclarèrent que le vieux était décidément et sans remède salao, ce qui veut dire aussi guignard qu\'on peut l\'être. On embarqua donc le gamin sur un autre bateau, lequel, en une semaine, ramena trois poissons superbes.</p>
				<p>Chaque soir le gamin avait la tristesse de voir le vieux rentrer avec sa barque vide. Il ne manquait pas d\'aller à sa rencontre et l\'aidait à porter les lignes serrées en spirales, la gaffe, le harpon, ou la voile roulée autour du mât. La voile était rapiécée avec de vieux sacs de farine ; ainsi repliée, elle figurait le drapeau en berne de la défaite.</p>
				<p>Le vieil homme était maigre et sec, avec des rides comme des coups de couteau sur la nuque. Les taches brunes de cet inoffensif cancer de la peau que cause la réverbération du soleil sur la mer des Tropiques marquaient ses joues ; elles couvraient presque entièrement les deux côtés de son visage ; ses mains portaient les entailles profondes que font les filins au bout desquels se débattent les lourds poissons. Mais aucune de ces entailles n\'était récente : elles étaient vieilles comme les érosions d\'un désert sans poissons. </p>
			</section>

			<section>
				<div>~ ERNEST HEMINGWAY ~</div>
			</section>

		</article>';

// je fait ma preg, normalement dans une boucle qui récupere toute mes balises
// j'ai ajouté [^<] pour qu'il ne s'arrete qu'à la prochaine balise de fermeture complete
// et m pour le multi lignes
// mais sans résultat...

$content = preg_replace("~^(<section>)([^<]*[.*])(</section>)$~m","",$content);

// j'affiche $content 

echo $content;

?>

Mammouth du PHP | 2278 Messages

07 avr. 2012, 08:39

Il y a flex et yacc qui sont destinés à ce genre de traitement.
Je viens d'écrire le fichier flex (mon premier fichier flex, car à écouter les gourous, j'avais cru qu'il fallait avoir fait au moins Polytechnique avancée pour pouvoir envisager d'espérer y comprendre quelque chose; et il est vrai que la littérature Internet sur le sujet est assez indigeste)
qui règle <br> => <br /> et
<input..> => <input ... />
je n'irai pas plus loin, car je n'en ai pas besoin, mais je pense qu'on pourrait sans grand mal vérifier que les balises sont équilibrées, mais pas les corriger automatiquement.
C'est très simple, et les regexp utilisées sont assez simples, car on divise le problème en morceaux et c'est flex qui crée le code adapté.
Modifié en dernier par sirakawa le 07 avr. 2012, 13:27, modifié 1 fois.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 2287 Messages

07 avr. 2012, 10:12

Il y a flex et yacc qui sont destinés à ce genre de traitement.
En effet, il y a aussi l'extension DOM.

Si tu veux continuer avec les regexp, la méthode de débuggage est simple :
- si ta regexp ne ramène actuellement rien, simplifie-la (en enlevant des morceaux...) jusqu'à trouver la partie bloquante dans ton motif.
- une fois débloqué, tu peux modifier ta regexp et régler le problème.

A un moment ou à un autre tu auras sans doute besoin de te pencher sur les modifieurs : http://fr2.php.net/manual/fr/reference. ... ifiers.php

@+
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 4 Messages

07 avr. 2012, 18:31

Il y a flex et yacc qui sont destinés à ce genre de traitement.
En effet, il y a aussi l'extension DOM.

Si tu veux continuer avec les regexp, la méthode de débuggage est simple :
- si ta regexp ne ramène actuellement rien, simplifie-la (en enlevant des morceaux...) jusqu'à trouver la partie bloquante dans ton motif.
- une fois débloqué, tu peux modifier ta regexp et régler le problème.

A un moment ou à un autre tu auras sans doute besoin de te pencher sur les modifieurs : http://fr2.php.net/manual/fr/reference. ... ifiers.php

@+
pour l'instant j'ai été obligé d'ajouter le s mais le résultat est encore tres incertain:
<?php

$texte = '
	<section>
		<div>hello world...</div>
	</section>
	<section>
		<div>sun is shining!</div>
	</section>';


	if(preg_match('~<section>(.*)</section>$~s',$texte,$matches))
		print_r($matches);


?>
résultat, il est allé chercher la derniere occurence de </section> au lieu de s'arréter et de reprendre, meme pas la peine de faire un match_all je sais que je ne suis pas tres doué pour les regex mais là je commence vraiment à etre déçu :?
Array
(
    [0] => <section>
		<div>hello world...</div>
	</section>
	<section>
		<div>sun is shining!</div>
	</section>
    [1] => 
		<div>hello world...</div>
	</section>
	<section>
		<div>sun is shining!</div>
	
)

ViPHP
ViPHP | 2287 Messages

07 avr. 2012, 19:08

Même conseil :) (cherche bien jusqu'à ce que tu connaisses la page par coeur, voire même au delà :D ) :

http://fr2.php.net/manual/fr/reference. ... ifiers.php

( surtout les derniers... )
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Petit nouveau ! | 4 Messages

07 avr. 2012, 19:36

Même conseil :) (cherche bien jusqu'à ce que tu connaisses la page par coeur, voire même au delà :D ) :

http://fr2.php.net/manual/fr/reference. ... ifiers.php

( surtout les derniers... )
dejas je n'arrive pas à ancrer mes masques, le A ne fonctionne pas et impossible de placer un ^ en début de chaine, ça pourrait venir d'une directive de configuration à changer tu pense?

pour le reste la casse et l'utf8 vu que je cré mes documents avec c'est fait, pour le . j'ai ajouté s comme ça c'est clair, l'extra on oublie et ungreedy je ne comprend pas tres bien à quoi ça sert donc comme ça a l'air d'économiser des ressources je le met par précaution, aprés ma syntaxe
~(<section>)(.*)(</section>)$~siuUx
ça fait 3 masques simples pour l'instant donc ça m'a l'air plutot logique

et pourquoi si je fait ~<section>([.+])</section>$~siuUx (si je met une classe de caracteres dans mon sous masque qui indique n'importe quel caracteres) il ne me renvoi rien du tout comme resultat?

Petit nouveau ! | 4 Messages

07 avr. 2012, 20:44

donc voila jme présente je m'appelle henry vous connaissez la suite...

bref mon interprétation du $ comme fin de chaine n'était pas éxactement juste, c'est bien la fin d'une chaine, mais de toute la chaine trouvée...

merci pour le coup de main :D