2008-09-24 7 views
2

J'écris un RSS à JSON parser et en tant que partie de cela, je dois utiliser htmlentities() sur n'importe quelle étiquette trouvée dans la balise de description. Actuellement, j'essaie d'utiliser preg_replace(), mais je me bats un peu avec cela. Mon code actuel (non fonctionnel) ressemble à:PHP: en utilisant preg_replace avec htmlentities

$pattern[0] = "/\<description\>(.*?)\<\/description\>/is"; 
$replace[0] = '<description>'.htmlentities("$1").'</description>'; 
$rawFeed = preg_replace($pattern, $replace, $rawFeed); 

Si vous avez une solution plus élégante à cela, n'hésitez pas à partager. Merci.

Répondre

5

Simple. Utilisez preg_replace_callback:

function _handle_match($match) 
{ 
    return '<description>' . htmlentities($match[1]) . '</description>'; 
} 

$pattern = "/\<description\>(.*?)\<\/description\>/is"; 
$rawFeed = preg_replace_callback($pattern, '_handle_match', $rawFeed); 

Il accepte tout type de rappel, donc également des méthodes dans les classes.

+0

Cela a fait l'affaire, merci. – VirtuosiMedia

+0

Comment modifieriez-vous le modèle pour qu'il corresponde au contenu de tous les noeuds imbriqués? Merci. – cili

0

La solution la plus élégante serait d'utiliser SimpleXML. Ou une bibliothèque tierce telle que XML_Feed_Parser ou Zend_Feed pour analyser le flux.

Voici un exemple SimpleXML:

<?php 
$rss = file_get_contents('http://rss.slashdot.org/Slashdot/slashdot'); 
$xml = simplexml_load_string($rss); 

foreach ($xml->item as $item) { 
    echo "{$item->description}\n\n"; 
} 
?> 

Gardez à l'esprit que RSS et RDF et Atom semblent différents, ce qui est la raison pour laquelle il peut donner un sens d'employer l'une des bibliothèques ci-dessus je l'ai mentionné.

+0

J'utilise en fait simpleXML, mais le problème est que tout code HTML incorporé à l'intérieur de la balise de description devient aussi un objet, ce qui explique pourquoi je suis l'entité qui l'a encodée en premier. – VirtuosiMedia

+0

Votre flux est alors cassé. Les bons flux enveloppent HTML et similaire dans CDATA. – Till

+0

Quand j'ai dit "bien", je voulais dire "valide". :) – Till

Questions connexes