Réponses:
Les Regex fiables pour HTML sont difficiles . Voici comment le faire avec DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Ce qui précède trouverait et afficherait le "externalHTML" de tous les A
éléments de la $html
chaîne.
Pour obtenir toutes les valeurs de texte du nœud, vous faites
echo $node->nodeValue;
Pour vérifier si l' href
attribut existe, vous pouvez faire
echo $node->hasAttribute( 'href' );
Pour obtenir l' href
attribut que vous feriez
echo $node->getAttribute( 'href' );
Pour changer l' href
attribut que vous feriez
$node->setAttribute('href', 'something else');
Pour supprimer l' href
attribut que vous feriez
$node->removeAttribute('href');
Vous pouvez également rechercher l' href
attribut directement avec XPath
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//a/@href');
foreach($nodes as $href) {
echo $href->nodeValue; // echo current attribute value
$href->nodeValue = 'new value'; // set new attribute value
$href->parentNode->removeAttribute('href'); // remove attribute
}
Regarde aussi:
Sur une note latérale: je suis sûr que c'est un double et vous pouvez trouver la réponse quelque part ici
Je suis d'accord avec Gordon, vous DEVEZ utiliser un analyseur HTML pour analyser le HTML. Mais si vous voulez vraiment une regex, vous pouvez essayer celle-ci:
/^<a.*?href=(["\'])(.*?)\1.*$/
Cela correspond <a
au début de la chaîne, suivi par un nombre quelconque char (non gourmand) .*?
puis href=
suivi par le lien entouré par deux "
ou'
$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);
Production:
array(3) {
[0]=>
string(37) "<a title="this" href="that">what?</a>"
[1]=>
string(1) """
[2]=>
string(4) "that"
}
Le modèle que vous voulez rechercher serait le modèle d'ancrage de lien, comme (quelque chose):
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
pourquoi tu ne correspond pas
"<a.*?href\s*=\s*['"](.*?)['"]"
<?php
$str = '<a title="this" href="that">what?</a>';
$res = array();
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res);
var_dump($res);
?>
puis
$ php test.php
array(2) {
[0]=>
array(1) {
[0]=>
string(27) "<a title="this" href="that""
}
[1]=>
array(1) {
[0]=>
string(4) "that"
}
}
qui fonctionne. Je viens de supprimer les premières accolades de capture.
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
pour attraper correctement toutes les valeurs href en utilisantforeach($res as $key => $val){echo $val[1]}
Pour ceux qui n'obtiennent toujours pas les solutions très faciles et rapides avec SimpleXML
$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com
Ça marche pour moi
Je ne suis pas sûr de ce que vous essayez de faire ici, mais si vous essayez de valider le lien, regardez le filtre_var () de PHP
Si vous avez vraiment besoin d'utiliser une expression régulière, consultez cet outil, cela peut vous aider: http://regex.larsolavtorvik.com/
En utilisant votre regex, je l'ai un peu modifié en fonction de vos besoins.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Je vous suggère personnellement d'utiliser un analyseur HTML
EDIT: testé
<a title="this" href="that">what?</a>
Test rapide: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
semble faire l'affaire, le premier match étant "ou", le second la valeur "href" "cela" et le troisième le "quoi?".
La raison pour laquelle j'ai laissé la première correspondance de "/ 'là-dedans est que vous pouvez l'utiliser pour le référencer ultérieurement pour la fermeture" /' donc c'est la même chose.
Voir l'exemple en direct sur: http://www.rubular.com/r/jsKyK2b6do
preg_match_all ("/ (] >) (. ?) (</ a) /", $ contents, $ impmatches, PREG_SET_ORDER);
Il est testé et récupère toutes les balises de n'importe quel code html.
Ce qui suit fonctionne pour moi et renvoie à la fois href
et value
de la balise d'ancrage.
preg_match_all("'\<a.*?href=\"(.*?)\".*?\>(.*?)\<\/a\>'si", $html, $match);
if($match) {
foreach($match[0] as $k => $e) {
$urls[] = array(
'anchor' => $e,
'href' => $match[1][$k],
'value' => $match[2][$k]
);
}
}
Le tableau multidimensionnel appelé $urls
contient désormais des sous-tableaux associatifs faciles à utiliser.