Zuverlässiger Regex für HTML ist schwierig . So geht's mit DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Das Obige würde das "OuterHTML" aller A
Elemente in der $html
Zeichenfolge finden und ausgeben .
Um zu erhalten alle Textwerte des Knotens, was Sie tun
echo $node->nodeValue;
Um zu überprüfen, ob das href
Attribut vorhanden ist, können Sie dies tun
echo $node->hasAttribute( 'href' );
Um zu erhalten das href
Attribut , das Sie tun würde
echo $node->getAttribute( 'href' );
Um das Attribut zu ändernhref
, würden Sie tun
$node->setAttribute('href', 'something else');
Um das Attribut zu entfernenhref
, würden Sie tun
$node->removeAttribute('href');
Sie können das href
Attribut auch direkt mit XPath abfragen
$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
}
Siehe auch:
Nebenbei: Ich bin sicher, dass dies ein Duplikat ist und Sie können die Antwort irgendwo hier finden
Ich stimme Gordon zu, Sie MÜSSEN einen HTML-Parser verwenden, um HTML zu analysieren. Aber wenn Sie wirklich einen regulären Ausdruck wollen, können Sie diesen ausprobieren:
Dies passt
<a
zu Beginn der Zeichenkette, gefolgt von einer beliebigen Anzahl von beliebigen char (nicht gierigen).*?
dannhref=
durch die Verbindung gefolgt durch entweder umgeben"
oder'
Ausgabe:
quelle
Das Muster, nach dem Sie suchen möchten, ist das Link-Anker-Muster, wie (etwas):
quelle
Warum passt du nicht einfach zusammen?
dann
was funktioniert. Ich habe gerade die ersten Erfassungsklammern entfernt.
quelle
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
, um alle href-Werte in usingforeach($res as $key => $val){echo $val[1]}
Für diejenigen, die die Lösungen mit SimpleXML immer noch nicht sehr einfach und schnell erhalten
Es funktioniert für mich
quelle
Ich bin nicht sicher, was Sie hier versuchen, aber wenn Sie versuchen, den Link zu validieren, schauen Sie sich PHPs filter_var () an.
Wenn Sie wirklich einen regulären Ausdruck verwenden müssen, schauen Sie sich dieses Tool an. Es kann hilfreich sein: http://regex.larsolavtorvik.com/
quelle
Mit Ihrer Regex habe ich sie ein wenig an Ihre Bedürfnisse angepasst.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Ich persönlich schlage vor, Sie verwenden eine HTML-Parser verwenden
EDIT: Getestet
quelle
<a title="this" href="that">what?</a>
Schnell Test:
<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
Scheint den Trick zu machen, wobei das erste Match "oder" ist, das zweite der "href" -Wert "das" und das dritte das "was?".Der Grund, warum ich das erste Match von "/ 'dort gelassen habe, ist, dass Sie es verwenden können, um es später für das Schließen zurück zu referenzieren" /', also ist es dasselbe.
Siehe Live-Beispiel unter: http://www.rubular.com/r/jsKyK2b6do
quelle
preg_match_all ("/ (] >) (. ?) (</ a) /", $ Inhalt, $ Impmatches, PREG_SET_ORDER);
Es wird getestet und ruft alle Tags aus jedem HTML-Code ab.
quelle
Das Folgende funktioniert für mich und gibt sowohl
href
als auchvalue
das Ankertag zurück.Das aufgerufene mehrdimensionale Array
$urls
enthält jetzt assoziative Unterarrays, die einfach zu verwenden sind.quelle