【问题标题】:regular expression tog et values of html tag attributes获取html标签属性值的正则表达式
【发布时间】:2011-02-01 13:39:11
【问题描述】:
<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);

我现在的那个好像不行

【问题讨论】:

标签: php regex


【解决方案1】:

考虑到您正在尝试从 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...


在 cmets 之后编辑:这是一个使用 DOMXpath 访问链接的快速示例;我想你想要&lt;li&gt;标签内的链接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"


正如你所看到的,唯一改变的是你用来找到正确的&lt;a&gt;标签的方式:而不是DOMDocument::getElementsByTagName,这只是一个问题:

【讨论】:

  • 有不止一个
  • 我正在尝试提取,所以我不能真正使用 DOMDocument 类,而且 html 比这更复杂。
  • @hao:那么,也许一个 XPath 查询,而不是 getElementsByTagName,可以解决问题吗? (见php.net/manual/en/domxpath.query.php ;;无论如何,我真的不会将正则表达式用于这种数据提取。
  • 您可以设置一个循环遍历 DOMDocument::getElementsByTagName('li') 返回的数组,并使用上述方法 IF (class== "zk_list_c2 f_l")
  • 我怎样才能只得到
  • $lis = $dom->getElementsByTagName('li'); foreach ($lis as $li) { if($li->getAttribute('class')=="zk_list_c2 f_l") { echo (trim($li->nodeValue))."
    ";这不显示里面的a标签,有没有办法让我提取li里面的所有东西?
  • nodeValue 属性仅包含节点的内容(这里是您的&lt;li&gt; 标签)本身,而不是其子节点的内容——获取&lt;a&gt; 标签的内容, 你必须访问它;;我想你可以用你的$lichildNodes 属性来循环&lt;li&gt; 的孩子;但是,如果我必须选择,我更喜欢 Xpath——我已经用一个例子编辑了我的答案。
  • 猜你喜欢
    相关资源
    最近更新 更多
    热门标签