使用 PHP 获取 DOM 元素字符串
Get DOM element string using PHP
我有一组 html 个字符串,看起来像这样:
<div id="myelementID" class="hello" data-foo="bar"> ... </div>
或
<div id="myelementID" class="world" data-this="that"> ... </div>
等等,你明白了。除了id="myelementID"
,其他所有属性都不固定。
我需要的是提取 <div>
的确切字符串,例如。 <div id="myelementID" class="hello" data-foo="bar">
如果 ID 为 "myelementID" 的元素存在。
截至目前,我可以使用 DomDocument 检查元素是否存在:
$dom = new DomDocument;
$dom->validateOnParse = true;
$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML($html_string);
libxml_use_internal_errors($internalErrors);
$el = $dom->getElementById("myelementID");
如何从这里获取元素的 HTML 字符串?我也愿意使用 preg_match,这可能是更好的解决方案。
编辑
更清楚地说,我不是在寻找元素的内容。我正在寻找字符串 <div id="myelementID" etc="etc" this="that">
。因为除了它的 ID 是 "myelementID" 之外,不确定该元素具有哪些属性,这就是我遇到问题的原因。
使用DOMNode::C14N
方法将节点规范化为字符串,substr
和strpos
函数获取所需的片段:
...
$el = $dom->getElementById("myelementID");
$elString = $el->C14N();
var_dump(substr($elString, 0, strpos($elString, '>') + 1));
输出(以你的例子为例):
string(51) "<div class="hello" data-foo="bar" id="myelementID">"
一个非常简单的正则表达式,它可以工作 (tested on RegExr)。唯一的缺点是 <div>
的任何包含 >
的属性都会导致 <div>
.
过早结束
<[^>]*\sid="myelementID"[^>]*>
正则表达式的细分:
<
<div
的起始标签
[^>]*
匹配不属于 >
的任意数量的字符
\s
匹配白色 space 字符(即 space)
id="myelementID"
匹配你的目标元素的 id
[^>]*
匹配不属于 >
的任意数量的字符
>
<div>
标签结束
想用DomDocument
可以用底码。在底部代码中,我使用 foreach()
迭代元素属性,然后将属性名称和属性值存储在 $elemString
变量中。
$html_string = '<div id="myelem4entID" class="hello" data-foo="bar">...</div>';
$dom = new DomDocument;
$dom -> loadHTML($html_string);
$el = $dom -> getElementById("myelementID");
if (!empty($el))
{
$elemString = "<div";
foreach ($el -> attributes as $attr)
{
$name = $attr -> nodeName;
$value = $attr -> nodeValue;
$elemString .= " {$name}=\"{$value}\"";
}
$elemString .= ">";
}
在demo
中测试
我有一组 html 个字符串,看起来像这样:
<div id="myelementID" class="hello" data-foo="bar"> ... </div>
或
<div id="myelementID" class="world" data-this="that"> ... </div>
等等,你明白了。除了id="myelementID"
,其他所有属性都不固定。
我需要的是提取 <div>
的确切字符串,例如。 <div id="myelementID" class="hello" data-foo="bar">
如果 ID 为 "myelementID" 的元素存在。
截至目前,我可以使用 DomDocument 检查元素是否存在:
$dom = new DomDocument;
$dom->validateOnParse = true;
$internalErrors = libxml_use_internal_errors(true);
$dom->loadHTML($html_string);
libxml_use_internal_errors($internalErrors);
$el = $dom->getElementById("myelementID");
如何从这里获取元素的 HTML 字符串?我也愿意使用 preg_match,这可能是更好的解决方案。
编辑
更清楚地说,我不是在寻找元素的内容。我正在寻找字符串 <div id="myelementID" etc="etc" this="that">
。因为除了它的 ID 是 "myelementID" 之外,不确定该元素具有哪些属性,这就是我遇到问题的原因。
使用DOMNode::C14N
方法将节点规范化为字符串,substr
和strpos
函数获取所需的片段:
...
$el = $dom->getElementById("myelementID");
$elString = $el->C14N();
var_dump(substr($elString, 0, strpos($elString, '>') + 1));
输出(以你的例子为例):
string(51) "<div class="hello" data-foo="bar" id="myelementID">"
一个非常简单的正则表达式,它可以工作 (tested on RegExr)。唯一的缺点是 <div>
的任何包含 >
的属性都会导致 <div>
.
<[^>]*\sid="myelementID"[^>]*>
正则表达式的细分:
<
<div
的起始标签
[^>]*
匹配不属于>
的任意数量的字符
\s
匹配白色 space 字符(即 space)id="myelementID"
匹配你的目标元素的 id[^>]*
匹配不属于>
的任意数量的字符
>
<div>
标签结束
想用DomDocument
可以用底码。在底部代码中,我使用 foreach()
迭代元素属性,然后将属性名称和属性值存储在 $elemString
变量中。
$html_string = '<div id="myelem4entID" class="hello" data-foo="bar">...</div>';
$dom = new DomDocument;
$dom -> loadHTML($html_string);
$el = $dom -> getElementById("myelementID");
if (!empty($el))
{
$elemString = "<div";
foreach ($el -> attributes as $attr)
{
$name = $attr -> nodeName;
$value = $attr -> nodeValue;
$elemString .= " {$name}=\"{$value}\"";
}
$elemString .= ">";
}
在demo
中测试