Yanıtlar:
HTML için güvenilir Regex zordur . Bunu DOM ile şu şekilde yapabilirsiniz :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Yukarıdakiler , dizedeki tüm öğelerin "dış HTML" ni bulur ve verir .A
$html
To olsun düğümün tüm metin değerlerini, yapmanız
echo $node->nodeValue;
To kontrol eğer href
nitelik Yapabileceğiniz var
echo $node->hasAttribute( 'href' );
To olsunhref
yapacağın niteliği
echo $node->getAttribute( 'href' );
To değiştirmekhref
özelliğini yapacağın
$node->setAttribute('href', 'something else');
To kaldırmakhref
yapacağın niteliği
$node->removeAttribute('href');
href
Özniteliği doğrudan XPath ile de sorgulayabilirsiniz.
$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
}
Ayrıca bkz:
Bir yan notta: Bunun bir kopya olduğuna eminim ve cevabı burada bir yerde bulabilirsiniz
Gordon'a katılıyorum, HTML'yi ayrıştırmak için bir HTML ayrıştırıcı kullanmanız GEREKİR. Ancak gerçekten bir normal ifade istiyorsanız, bunu deneyebilirsiniz:
/^<a.*?href=(["\'])(.*?)\1.*$/
Bu <a
, dizenin başlangıcında eşleşir , ardından herhangi bir sayıda karakter (açgözlü olmayan) ve .*?
ardından href=
ya da "
veya'
$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);
Çıktı:
array(3) {
[0]=>
string(37) "<a title="this" href="that">what?</a>"
[1]=>
string(1) """
[2]=>
string(4) "that"
}
Aramak istediğiniz model, (bir şey) gibi bağlantı bağlantı kalıbı olacaktır:
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
neden sadece eşleşmiyorsun
"<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);
?>
sonra
$ php test.php
array(2) {
[0]=>
array(1) {
[0]=>
string(27) "<a title="this" href="that""
}
[1]=>
array(1) {
[0]=>
string(4) "that"
}
}
hangi çalışır. İlk yakalama tellerini yeni çıkardım.
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
Kullanırken tüm href değerlerini doğru bir şekilde yakalamak için kullanmanızı tavsiye ederimforeach($res as $key => $val){echo $val[1]}
SimpleXML kullanarak çözümleri hala çok kolay ve hızlı alamayanlar için
$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com
Benim için çalışıyor
Burada ne yapmaya çalıştığınızdan emin değilim, ancak bağlantıyı doğrulamaya çalışıyorsanız, o zaman PHP'nin filter_var () öğesine bakın
Eğer gerçekten bir düzenli ifade kullanmanız gerekiyorsa, bu araca bir göz atın, yardımcı olabilir: http://regex.larsolavtorvik.com/
Normal ifadenizi kullanarak ihtiyacınıza uyacak şekilde biraz değiştirdim.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Ben şahsen bir HTML Ayrıştırıcı kullanmanızı öneririm
DÜZENLEME: Test edildi
<a title="this" href="that">what?</a>
Hızlı test: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
İlk maç "veya", ikincisi "href" değeri "bu" ve üçüncüsü "ne?" İle hile yapıyor gibi görünüyor.
"/" İlk eşleşmesini burada bırakmamın nedeni, onu daha sonra "/" kapanışı için geri referans yapmak için kullanabilmenizdir, yani aynıdır.
Canlı örneğe bakın: http://www.rubular.com/r/jsKyK2b6do
preg_match_all ("/ (] >) (. ?) (</ a) /", $ içerikler, $ impmatches, PREG_SET_ORDER);
Test edilir ve herhangi bir html kodundan tüm bir etiketi alır.
Aşağıdakiler benim için çalışıyor ve hem href
ve hem value
de bağlantı etiketini döndürüyor .
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]
);
}
}
Adlı çok boyutlu dizi $urls
, artık kullanımı kolay ilişkilendirilebilir alt dizileri içerir.