Ancrer les balises au texte brut dans le contenu
-
10-07-2019 - |
Question
J'essaie de faire correspondre les balises <a>
dans mon contenu et de les remplacer par 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 <=> 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?
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
La solution
Vous pouvez faire la correspondance sans égarement en utilisant ?
.
Vous devez également prendre en compte le fait qu'il peut y avoir des attributs avant l'attribut href
.
$result = preg_replace('/<a [^>]*?href="(http:\/\/[A-Za-z0-9\\.:\/]+?)">([\\s\\S]*?)<\/a>/',
'<strong>\\2</strong> [\\1]', $content);
Autres conseils
Vous devriez utiliser DOM pour analyser le code HTML, pas les expressions régulières ...
Éditer: Code mis à jour pour effectuer une analyse rationnelle simple sur la valeur de l'attribut href.
Éditer # 2: La boucle a été 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();
?>