【问题标题】:Regex and PHP with HTML带有 HTML 的正则表达式和 PHP
【发布时间】:2018-11-12 00:33:40
【问题描述】:

我需要使用 PHP 从 HTML 页面捕获特定标签。

一个 HTML 文档可以有多个结果(多行也是如此)。如果标签包含data-uid 值,也只需要匹配标签。

  • 标签名称(div、span 等...)
  • data-uid 的值
  • 子节点。

到目前为止,我能够捕获标签名称、data-uid 的值。但不是儿童节点。

<div class="testClassOne" data-uid="123456">
    <div class="testClassTwo">Content</div>
    <-- More nodes -->
</div>

结果:{标签:“div”,data-uid:123456,孩子:“&lt;div class="testClassTwo"&gt;Content&lt;/div&gt;”}

&lt;div class="testClassOne" data-uid="123456"&gt;&lt;/div&gt;

结果:{标签:“div”,data-uid:123456,孩子:“”}

我目前的正则表达式和函数如下...

$regex = '/<(.*) (?:.*?)data-uid="([^"]*?)"(?:.*?)>(.*?)<\/\1>/';
$content = preg_replace_callback($regex, 'test', $content);

function test($arg){
    print_r($arg);
}

有谁知道解决这个问题(也将孩子作为字符串捕获?)?

【问题讨论】:

  • 你会远远更好地使用 DOM 解析来做到这一点;将正则表达式用于此类任务会变得复杂,并且最终会变得相当脆弱
  • @landru27 我也尝试使用 DOMDocument 来执行此操作。但是失败了,还没有达到这一步。有什么建议可以有效地捕获 tagName、data-uid 以及孩子吗?
  • @stackminu :如果您已经对 DOM 解析进行了充分研究、尝试并失败了,那么您最好发布一个 SO 问题,详细说明您的 DOM 解析中哪些问题,而不是放弃,切换到正则表达式,在那里也失败了,并向 SO 发布您的正则表达式尝试;换句话说,回到 DOM 解析;未来你会非常感谢你

标签: php html regex


【解决方案1】:

正如其他人所说,请改用 DOM 解析器和 xpath 表达式。
下面的表达式

$items = $xpath->query("//*[@data-uid]");

将在 dom 中查询具有 data-uid 作为属性的所有元素,并返回一个列表。之后,您可以在每个项目上致电getAttribute()


PHP:
<?php

$data = <<<DATA
<div class="testClassOne" data-uid="123456">
    <div class="testClassTwo">Content</div>
    <-- More nodes -->
</div>
DATA;

$dom = new DOMDocument();

# suppress warnings
libxml_use_internal_errors(true);
$dom->loadHTML($data);
libxml_clear_errors();

# set up an xpath expression
$xpath = new DOMXPath($dom);
$items = $xpath->query("//*[@data-uid]");

foreach ($items as $item) {
    echo "tagname: " . $item->tagName . "\n";
    echo "uid: " . $item->getAttribute("data-uid") . "\n";
    foreach($item->getElementsByTagName('*') as $child ){
        print_r($child);
    }   
}

?>


这产生
tagname: div
uid: 123456
DOMElement Object
(
    [tagName] => div
    [schemaTypeInfo] => 
    [nodeName] => div
    [nodeValue] => Content
    [nodeType] => 1
    [parentNode] => (object value omitted)
    [childNodes] => (object value omitted)
    [firstChild] => (object value omitted)
    [lastChild] => (object value omitted)
    [previousSibling] => (object value omitted)
    [nextSibling] => (object value omitted)
    [attributes] => (object value omitted)
    [ownerDocument] => (object value omitted)
    [namespaceURI] => 
    [prefix] => 
    [localName] => div
    [baseURI] => 
    [textContent] => Content
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 2011-01-08
    • 2015-01-17
    相关资源
    最近更新 更多