正则表达式html标记属性的值和值

时间:2010-03-27 16:33:04

标签: php regex

<li class="zk_list_c2 f_l"><a title="abc" target="_blank" href="link">
                                        abc
                                    </a>&nbsp;</li>

我将如何提取abc和链接?

$pattern="/<li class=\"zk_list_c2 f_l\"><a title=\"(.*)\" target=\"_blank\" href=\"(.*)\">\s*(.*)\s*<\/a>&nbsp;<\/li>/m";
preg_match_all($pattern, $content, $matches);

我现在拥有的那个似乎不起作用

1 个答案:

答案 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>&nbsp;</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"


我会说,代码并不是很难,但是,简而言之,这就是它正在做的事情:

请注意:在尝试使用其值之前,您可能需要检查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,这只是一个问题: