Niezawodne Regex dla HTML są trudne . Oto jak to zrobić z DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Powyższe mogłoby znaleźć i wyprowadzić „zewnętrzny HTML” wszystkich A
elementów w $html
ciągu.
Aby uzyskać wszystkie wartości tekstowe węzła, musisz to zrobić
echo $node->nodeValue;
Aby sprawdzić, czy href
atrybut istnieje, możesz to zrobić
echo $node->hasAttribute( 'href' );
Aby uzyskać ten href
atrybut zrobiłbyś
echo $node->getAttribute( 'href' );
Aby zmienić ten href
atrybut chcesz zrobić
$node->setAttribute('href', 'something else');
Aby usunąć ten href
atrybut zrobiłbyś
$node->removeAttribute('href');
Możesz również zapytać o href
atrybut bezpośrednio za pomocą 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
}
Zobacz także:
Na marginesie: jestem pewien, że jest to duplikat, a odpowiedź można znaleźć gdzieś tutaj
Zgadzam się z Gordonem, MUSISZ użyć parsera HTML do parsowania HTML. Ale jeśli naprawdę potrzebujesz wyrażenia regularnego, możesz wypróbować ten:
Dopasowuje
<a
na początku łańcucha, a następnie dowolną liczbę dowolnego char (nie chciwy).*?
następniehref=
następuje link otoczony albo"
albo'
Wynik:
źródło
Wzorzec, którego chcesz szukać, byłby wzorcem kotwicy linku, na przykład (coś):
źródło
dlaczego po prostu nie pasujesz
następnie
który działa. Właśnie usunąłem pierwsze szelki do chwytania.
źródło
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
w celu prawidłowego wyłapania wszystkich wartości href podczas używaniaforeach($res as $key => $val){echo $val[1]}
Dla tych, którzy nadal nie otrzymują rozwiązań bardzo łatwo i szybko przy użyciu SimpleXML
To działa dla mnie
źródło
Nie jestem pewien, co próbujesz tutaj zrobić, ale jeśli próbujesz zweryfikować łącze, spójrz na zmienną filter_var () PHP
Jeśli naprawdę potrzebujesz użyć wyrażenia regularnego, wypróbuj to narzędzie, może ono pomóc: http://regex.larsolavtorvik.com/
źródło
Używając Twojego wyrażenia regularnego, zmodyfikowałem go nieco, aby odpowiadał Twoim potrzebom.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Osobiście sugeruję użycie parsera HTML
EDYCJA: testowane
źródło
<a title="this" href="that">what?</a>
Szybki test:
<a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
wygląda na to, że pierwszy mecz to „lub”, drugi to wartość „href”, a trzeci to „co?”.Powodem, dla którego zostawiłem tam pierwsze dopasowanie „/”, jest to, że możesz go użyć do późniejszego odniesienia do niego w celu zamknięcia „/”, więc jest to to samo.
Zobacz przykład na żywo na: http://www.rubular.com/r/jsKyK2b6do
źródło
preg_match_all ("/ (] >) (. ?) (</ a) /", $ content, $ impmatches, PREG_SET_ORDER);
Jest testowany i pobiera cały tag z dowolnego kodu HTML.
źródło
Poniższe działa dla mnie i zwraca zarówno tag kotwicy, jak
href
ivalue
.Wielowymiarowa tablica o nazwie
$urls
zawiera teraz asocjacyjne tablice podrzędne, które są łatwe w użyciu.źródło