<li class="zk_list_c2 f_l"><a title="abc" target="_blank" href="link">
abc
</a> </li>
Run Code Online (Sandbox Code Playgroud)
我将如何提取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);
Run Code Online (Sandbox Code Playgroud)
我现在拥有的那个似乎不起作用
考虑到您正在尝试从HTML字符串中提取一些数据,正则表达式通常不是该工作的正确/最佳工具.
相反,为什么不使用DOM解析器,像DOMDocument类,提供了PHP,它的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));
}
Run Code Online (Sandbox Code Playgroud)
你会得到以下输出:
string(4) "link"
string(3) "abc"
Run Code Online (Sandbox Code Playgroud)
我会说,代码并不是很难,但是,简而言之,这就是它正在做的事情:
DOMDocument::loadHTML<a>标签:DOMDocument::getElementsByTagNamehref属性:DOMElement::getAttributeDOMNode::$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));
}
Run Code Online (Sandbox Code Playgroud)
而且,你得到:
string(4) "link"
string(3) "abc"
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,唯一改变的是您用于获取正确<a>标签的方式:而不是DOMDocument::getElementsByTagName,它只是一个问题:
DOMXPath::query使用正确的XPath查询进行调用.