Afficher un message
Vieux 01/10/2007, 11h49   #2
Mickael Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Circonscrire un eregi_replace ?

paul a écrit :

> C'est possible ça ?
> Merci pour l'aide


Attention, la solution que je vais te proposer est très bourrin, ça
peut éventuellement consommer beaucoup de mémoire. L'astuce consisterait
à utiliser un parser de HTML/XML : DOMDocument
<http://fr2.php.net/manual/fr/ref.dom.php> avec DOMXpath
<http://fr2.php.net/manual/fr/function.dom-domxpath-construct.php>, puis
en traitant les résultant de la requête avec preg_match.

Par exemple, pas testé et fait de tête (j'vais pas tout faire non plus
:p) :

<?php

$word = 'toto' ;

$doc = DOMDocument::loadHTML($output) ;
$doc->validate() ;
$finder = new DOMXPath('//text()') ;

foreach($finder as $textNode)
{
// L'expression régulière ci-dessous ne détectera que la première
occurrence du mot $word.
if(preg_match('`^(.*)\b('.$word.')\b(.*)$`', $textNode.value, $matches))
{
$hlSpan = $doc->createElement('span', $word) ;
$hlSpan->setAttribute('class', 'highlight') ;

$beforeNode = $textNode.ownderDocument.createTextNode($matches[1]) ;
$afterNode = $textNode.ownderDocument.createTextNode($matches[3]) ;

$textNode.parentNode.appendChild($beforeText) ;
$textNode.parentNode.appendChild($hlSpan) ;
$textNode.parentNode.appendChild($afterText) ;

$textNode.parentNode.removeChild($textNode) ;
}
}

echo $doc->saveHTML() ;

?>

Les remarques sur ma façon de coder sont les bienvenues, ou sur des
erreurs aussi.

Bon début de semaine à tous !
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
 
Page generated in 0,06065 seconds with 9 queries