2009-09-17 6 views
0

J'essaie de faire correspondre <a> balises dans mon contenu et remplacer puis avec le texte du lien suivi de l'URL entre crochets pour une version imprimée. L'exemple suivant fonctionne s'il n'y a que le "href". Si le <a> contient un autre attribut, il correspond trop et ne renvoie pas le résultat souhaité. Comment puis-je faire correspondre l'URL et le texte du lien et c'est tout?Ancrer les balises au texte brut dans le contenu

Voici mon code:

<?php 
$content = '<a href="http://www.website.com">This is a text link</a>'; 
$result = preg_replace('/<a href="(http:\/\/[A-Za-z0-9\\.:\/]{1,})">([\\s\\S]*?)<\/a>/', 
    '<strong>\\2</strong> [\\1]', $content); 
echo $result; 
?> 

Résultat souhaité:

<strong>This is a text link </strong> [http://www.website.com] 

Merci, Jason

+0

Avez-vous déjà été capable de résoudre votre problème en utilisant l'une des réponses? –

+0

Merci de votre retour. Oui, j'étais capable d'utiliser le "?" pour le match ungreedy pour obtenir le résultat désiré. Cela fonctionne bien pour cette situation particulière. Cependant, j'aime votre méthode d'analyse du DOM. J'ai besoin de jouer avec ça pour mieux le comprendre. – JasonBartholme

Répondre

1

Vous pouvez faire le match ungreedy en utilisant ?. Vous devez également prendre en compte des attributs avant l'attribut href.

$result = preg_replace('/<a [^>]*?href="(http:\/\/[A-Za-z0-9\\.:\/]+?)">([\\s\\S]*?)<\/a>/', 
    '<strong>\\2</strong> [\\1]', $content); 
8

Vous devez utiliser DOM pour analyser HTML, les expressions régulières ... pas

Edit: code mis à jour pour faire simple, l'analyse syntaxique regex sur la valeur de l'attribut href. Éditer # 2: Rendre la boucle régressive afin qu'elle puisse gérer plusieurs remplacements.

$content = ' 
<p><a href="http://www.website.com">This is a text link</a></p> 
<a href="http://sitename.com/#foo">bah</a> 

<a href="#foo">I wont change</a> 

'; 


$dom = new DOMDocument(); 
    $dom->loadHTML($content); 

    $anchors = $dom->getElementsByTagName('a'); 
    $len = $anchors->length; 

    if ($len > 0) { 
     $i = $len-1; 
     while ($i > -1) { 
     $anchor = $anchors->item($i); 

     if ($anchor->hasAttribute('href')) { 
      $href = $anchor->getAttribute('href'); 
      $regex = '/^http/'; 

      if (!preg_match ($regex, $href)) { 
      $i--; 
      continue; 
      } 

      $text = $anchor->nodeValue; 
      $textNode = $dom->createTextNode($text); 

      $strong = $dom->createElement('strong'); 
      $strong->appendChild($textNode); 

      $anchor->parentNode->replaceChild($strong, $anchor); 
     } 
     $i--; 
     } 
    } 

    echo $dom->saveHTML(); 
    ?> 
+0

nu avec moi, en essayant de le reformater: p –

+0

enfin - et c'est parti. –

+0

Merci pour l'effort meder. J'ai besoin de plonger plus dans la manipulation DOM. – JasonBartholme

Questions connexes