Câu trả lời:
Regex đáng tin cậy cho HTML rất khó . Đây là cách thực hiện với DOM :
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
Ở trên sẽ tìm và xuất ra "externalHTML" của tất cả các A
phần tử trong $html
chuỗi.
Để nhận tất cả các giá trị văn bản của nút, bạn làm
echo $node->nodeValue;
Để kiểm tra nếu href
thuộc tính tồn tại bạn có thể làm
echo $node->hasAttribute( 'href' );
Để có được các href
thuộc tính bạn muốn làm
echo $node->getAttribute( 'href' );
Để thay đổi các href
thuộc tính bạn muốn làm
$node->setAttribute('href', 'something else');
Để loại bỏ các href
thuộc tính bạn muốn làm
$node->removeAttribute('href');
Bạn cũng có thể truy vấn href
trực tiếp thuộc tính bằng 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
}
Cũng thấy:
Ghi chú bên lề: Tôi chắc chắn rằng đây là một bản sao và bạn có thể tìm thấy câu trả lời ở đâu đó tại đây
Tôi đồng ý với Gordon, bạn PHẢI sử dụng trình phân tích cú pháp HTML để phân tích cú pháp HTML. Nhưng nếu bạn thực sự muốn có một regex, bạn có thể thử cái này:
/^<a.*?href=(["\'])(.*?)\1.*$/
Điều này khớp <a
ở đầu chuỗi, theo sau là một số bất kỳ của bất kỳ ký tự nào (không tham lam), .*?
sau đó href=
là liên kết được bao quanh bởi "
hoặc'
$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);
Đầu ra:
array(3) {
[0]=>
string(37) "<a title="this" href="that">what?</a>"
[1]=>
string(1) """
[2]=>
string(4) "that"
}
Mẫu bạn muốn tìm sẽ là mẫu neo liên kết, như (một cái gì đó):
$regex_pattern = "/<a href=\"(.*)\">(.*)<\/a>/";
tại sao bạn không chỉ phù hợp
"<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);
?>
sau đó
$ php test.php
array(2) {
[0]=>
array(1) {
[0]=>
string(27) "<a title="this" href="that""
}
[1]=>
array(1) {
[0]=>
string(4) "that"
}
}
cái nào hoạt động. Tôi vừa tháo niềng răng chụp đầu tiên.
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
để nắm bắt một cách chính xác tất cả các giá trị href trong việc sử dụngforeach($res as $key => $val){echo $val[1]}
Đối với những người vẫn chưa nhận được các giải pháp rất dễ dàng và nhanh chóng bằng cách sử dụng SimpleXML
$a = new SimpleXMLElement('<a href="www.something.com">Click here</a>');
echo $a['href']; // will echo www.something.com
Nó làm việc cho tôi
Tôi không chắc bạn đang cố gắng làm gì ở đây, nhưng nếu bạn đang cố gắng xác thực liên kết thì hãy xem filter_var () của PHP
Nếu bạn thực sự cần sử dụng biểu thức chính quy thì hãy xem công cụ này, nó có thể hữu ích: http://regex.larsolavtorvik.com/
Sử dụng regex của bạn, tôi đã sửa đổi nó một chút để phù hợp với nhu cầu của bạn.
<a.*?href=("|')(.*?)("|').*?>(.*)<\/a>
Cá nhân tôi khuyên bạn nên sử dụng Trình phân tích cú pháp HTML
CHỈNH SỬA: Đã kiểm tra
<a title="this" href="that">what?</a>
Kiểm tra nhanh: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
có vẻ là một mẹo nhỏ, với kết quả phù hợp đầu tiên là "hoặc", so khớp thứ hai là 'href' giá trị 'that' và kết quả thứ ba là 'what?'.
Lý do tôi để kết quả khớp đầu tiên của "/ 'ở đó là bạn có thể sử dụng nó để tham chiếu ngược lại sau này cho việc đóng" /' nên nó giống nhau.
Xem ví dụ trực tiếp trên: http://www.rubular.com/r/jsKyK2b6do
preg_match_all ("/ (] >) (. ?) (</ a) /", $ nội dung, $ impmatches, PREG_SET_ORDER);
Nó được thử nghiệm và tìm nạp tất cả thẻ từ bất kỳ mã html nào.
Phần sau hoạt động đối với tôi và trả về cả href
và value
của thẻ liên kết.
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]
);
}
}
Mảng đa chiều được gọi $urls
hiện chứa các mảng con liên kết rất dễ sử dụng.