2010-04-24 3 views

Répondre

3

Je ne sais pas, je comprends vraiment ce que vous demandez, mais si vous:

  • Avoir une chaîne qui contient du code HTML
  • et que vous souhaitez remplacer tous les liens vers abc.com par un texte

Ensuite, une bonne solution (mieux que les expressions régulières, devrais-je dire!) serait d'utiliser les classes liées DOM-- en particulier, vous pouvez jeter un oeil à la classe DOMDocument, et son loadHTML méthode.


Par exemple, étant donné que la partie HTML est déclarée dans une variable:

$html = <<<HTML 
<p>some text</p> 
<a href="http://abc.com">Title</a> 
<p>some more text</p> 
<a href="http://xyz.com">Title</a> 
<p>and some again</p> 
HTML; 


Vous pouvez ensuite utiliser quelque chose comme ceci:

$dom = new DOMDocument(); 
$dom->loadHTML($html); 
$tags = $dom->getElementsByTagName('a'); 
for ($i = $tags->length - 1 ; $i > -1 ; $i--) { 
    $tag = $tags->item($i); 
    if ($tag->getAttribute('href') == 'http://abc.com') { 
     $replacement = $dom->createTextNode($tag->nodeValue); 
     $tag->parentNode->replaceChild($replacement, $tag); 
    } 
} 
echo $dom->saveHTML(); 


Et cela se vous la partie suivante de HTML, en sortie:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body> 
<p>some text</p> 
Title 
<p>some more text</p> 
<a href="http://xyz.com">Title</a> 
<p>and some again</p> 
</body></html> 


Notez que toute la partie <a href="http://abc.com">Title</a> a été remplacée par le texte qu'elle contenait.

Si vous voulez un autre texte à la place, utilisez-le simplement là où j'ai utilisé $tag->nodeValue, qui est le contenu actuel du nœud qui est supprimé.

Malheureusement, oui, cela génère un document HTML complet, y compris la déclaration DOCTYPE, <html> et <body> étiquettes, ...

+0

Merci, ça fonctionne.Mais quand je suis en train d'analyser le contenu via un flux RSS en utilisant Magpie RSS, le lien que je veux remplacer est souvent dynamique. Je veux dire dans le tag de RSS a des liens comme http://abc.com/tag/tag1, http: //abc.com/tag/tag2 .... Puis-je remplacer tous ces liens avec un texte? – nuphero

1

Pour couvrir un autre cas interprété:

$string = '<a href="http://abc.com">Title</a> <a href="http://xyz.com">Title</a>'; 
$pattern = '/\<\s?a\shref[\s="\']+([^\'"]+)["\']\>([^\<]+)[^\>]+\>/'; 
$result = preg_replace_callback($pattern, 'replaceLinkValueSelectively', $string); 

function replaceLinkValueSelectively($matches) 
{ 
    list($link, $URL, $value) = $matches; 

    switch ($URL) 
    { 
     case 'http://abc.com': 
      $newValue = 'New Title'; 
      break; 

     default: 
      return $link; 
    } 

    return str_replace($value, $newValue, $link);   
} 

echo $result; 
entrée

<a href="http://abc.com">Title</a> <a href="http://xyz.com">Title</a> 

devient

<a href="http://abc.com">New Title</a> <a href="http://xyz.com">Title</a> 

$ chaîne est votre entrée, $ résultat est votre entrée modifiée. Vous pouvez définir plusieurs URL en tant que cas. S'il vous plaît noter: j'ai écrit cette expression régulière hâtivement, et je suis tout à fait le novice. Veuillez vérifier que cela convient à tous les cas prévus.