<li class="zk_list_c2 f_l"><a title="abc" target="_blank" href="link">
abc
</a> </li>
我将如何提取abc和链接?
$pattern="/<li class=\"zk_list_c2 f_l\"><a title=\"(.*)\" target=\"_blank\" href=\"(.*)\">\s*(.*)\s*<\/a> <\/li>/m";
preg_match_all($pattern, $content, $matches);
我现在拥有的那个似乎不起作用
答案 0 :(得分:9)
考虑到您正在尝试从 HTML字符串中提取一些数据,正则表达式通常不是该作业的正确/最佳工具。
相反,为什么不使用 DOM解析器,如PHP提供的 DOMDocument
class 及其DOMDocument::loadHTML
方法?
然后,您可以使用DOM方法浏览HTML文档 - 这比使用正则表达式要容易得多,特别是考虑到HTML不是常规。
例如,您可以使用以下内容:
$html = <<<HTML
<li class="zk_list_c2 f_l"><a title="abc" target="_blank" href="link">
abc
</a> </li>
HTML;
$dom = new DOMDocument();
$dom->loadHTML($html);
$as = $dom->getElementsByTagName('a');
foreach ($as as $a) {
var_dump($a->getAttribute('href'));
var_dump(trim($a->nodeValue));
}
你会得到以下输出:
string(4) "link"
string(3) "abc"
我会说,代码并不是很难,但是,简而言之,这就是它正在做的事情:
DOMDocument::loadHTML
<a>
代码:DOMDocument::getElementsByTagName
href
属性:DOMElement::getAttribute
DOMNode::$nodeValue
请注意:在尝试使用其值之前,您可能需要检查href
属性是否存在DOMElement::hasAttribute
...
评论后编辑:这是使用DOMXpath获取链接的快速示例;我想你想要<li>
标签内的链接class="zk_list_c2 f_l"
:
$dom = new DOMDocument();
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
$as = $xpath->query('//li[@class="zk_list_c2 f_l"]/a');
foreach ($as as $a) {
var_dump($a->getAttribute('href'));
var_dump(trim($a->nodeValue));
}
而且,再次,你得到:
string(4) "link"
string(3) "abc"
正如您所看到的,唯一改变的是您使用右侧<a>
标记的方式:而不是DOMDocument::getElementsByTagName
,这只是一个问题:
DOMXPath::query
。