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 $htmlchaîne.
Pour obtenir toutes les valeurs de texte du nœud, vous faites
echo $node->nodeValue;
Pour vérifier si l' hrefattribut existe, vous pouvez faire
echo $node->hasAttribute( 'href' );
Pour obtenir l' hrefattribut que vous feriez
echo $node->getAttribute( 'href' );
Pour changer l' hrefattribut que vous feriez
$node->setAttribute('href', 'something else');
Pour supprimer l' hrefattribut que vous feriez
$node->removeAttribute('href');
Vous pouvez également rechercher l' hrefattribut 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 <aau 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 hrefet valuede 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é $urlscontient désormais des sous-tableaux associatifs faciles à utiliser.