Answers:
可靠的HTML正则表达式很困难。这是使用DOM的方法:
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('a') as $node) {
echo $dom->saveHtml($node), PHP_EOL;
}
上面将找到并输出字符串中所有元素的“ outerHTML”。A
$html
要获取节点的所有文本值,请执行以下操作
echo $node->nodeValue;
要检查是否href
属性存在,你可以做
echo $node->hasAttribute( 'href' );
为了获得该href
你做的属性
echo $node->getAttribute( 'href' );
要更改的href
属性,你会怎么做
$node->setAttribute('href', 'something else');
要删除的href
,你会怎么做属性
$node->removeAttribute('href');
您也可以href
直接使用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
}
另请参阅:
旁注:我确定这是重复的,您可以在这里的某个地方找到答案
我同意Gordon,您必须使用HTML解析器来解析HTML。但是,如果您真的想要正则表达式,可以尝试以下方法:
/^<a.*?href=(["\'])(.*?)\1.*$/
这<a
在字符串开头匹配,后跟任意数量的任何字符(非贪心字符),.*?
然后href=
是由"
或包围的链接'
$str = '<a title="this" href="that">what?</a>';
preg_match('/^<a.*?href=(["\'])(.*?)\1.*$/', $str, $m);
var_dump($m);
输出:
array(3) {
[0]=>
string(37) "<a title="this" href="that">what?</a>"
[1]=>
string(1) """
[2]=>
string(4) "that"
}
你为什么不匹配
"<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);
?>
然后
$ php test.php
array(2) {
[0]=>
array(1) {
[0]=>
string(27) "<a title="this" href="that""
}
[1]=>
array(1) {
[0]=>
string(4) "that"
}
}
哪个有效。我刚刚删除了第一个捕获括号。
preg_match_all("/<a.*?href\s*=\s*['\"](.*?)['\"]/", $str, $res, PREG_SET_ORDER);
该命令以正确捕获使用中的所有href值foreach($res as $key => $val){echo $val[1]}
我不确定您要在这里做什么,但是如果您要验证链接,请查看PHP的filter_var()
如果您确实需要使用正则表达式,请查看此工具,它可能会有所帮助:http : //regex.larsolavtorvik.com/
快速测试: <a\s+[^>]*href=(\"\'??)([^\1]+)(?:\1)>(.*)<\/a>
似乎可以解决问题,第一个匹配为“或”,第二个为“ href”值“ that”,第三个为“ what?”。
我之所以将第一个匹配项“ /”留在其中的原因是,您可以稍后用它反向引用以结束“ /”,因此它是相同的。
参见以下示例:http : //www.rubular.com/r/jsKyK2b6do
preg_match_all( “/(] >)(。 )(</ A)/?”,$内容,$ impmatches,PREG_SET_ORDER);
它已经过测试,可以从任何html代码中获取所有标签。