PHP - DOMDocument - 获取前一个元素及其数据属性
PHP - DOMDocument - Get the previous element and his data attributes
您好,我正在尝试通过字符串管理 DOM文档。
我的字符串看起来像这样:
$String =
<p>
<div class="ST" data-start="1" data-end="5">
<span>WORD1</span><span>WORD2</span>
</div>
</p>
<p>
WORD3 WORD4
</p>
<p>
<div class="ST" data-start="6" data-end="10">
<span>WORD5</span><span>WORD6</span>
</div>
</p>
我的目标是将单词 WORD3
和 WORD4
放在 <div>
标签中,例如 WORD1
WORD2
和 WORD5
WORD6
第一个和最后一个 <p>
标签。另外,我需要得到前一个 p > div
的 data-start
data-end
并最终得到这个:
$String =
<p>
<div class="ST" data-start="1" data-end="5">
<span>WORD1</span><span>WORD2</span>
</div>
</p>
<p>
<div class="ST" data-start="1" data-end="5">
WORD3 WORD4
</div>
</p>
<p>
<div class="ST" data-start="6" data-end="10">
<span>WORD5</span><span>WORD6</span>
</div>
</p>
我设法把WORD3和WORD4放在一个<div>
中,但我不知道如何得到前一个元素p > div
和他的属性data-start
和data-end
...
我的代码:
public function reverseTransform($value) {
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadHTML($value);
$pTags = $dom->getElementsByTagName('p');
$TagFull='';
foreach ($pTags as $pTag) {
$valuePTagFull = $this->DOMinnerHTML($pTag);
if (strpos($valuePTagFull,'<div') === false) {
$valuePTagFull = "<div class='st'>".$valuePTagFull."</div>";
}
$TagFull .= $valuePTagFull;
}
}
private function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child) {
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}
事实上,对于每个 <p>
其中有 WORDx
但没有 <div>
,我将 WORDx
包装在 <div>
和 data-start
和 data-end
属性的前一个 <p> >> <div>
但是如何 select 并使用 DOM、XML 或其他方式从前一个元素获取属性?
谢谢!
我想您可以使用正则表达式获取开始结束的最后一个值,但不会使用 DOM。
if (strpos($valuePTagFull,'<div') === false) {
$valuePTagFull = "<div class='st' data-start=".$matches[1]." data-end=".$matches[2].">".$valuePTagFull."</div>";
}
else{
preg_match('~<div[^>]*?class="ST"[^>]*?data-start="(\d*?)" data-end="(\d*?)">~',$valuePTagFull,$matches);
}
$TagFull .= $valuePTagFull;
您好,我正在尝试通过字符串管理 DOM文档。 我的字符串看起来像这样:
$String =
<p>
<div class="ST" data-start="1" data-end="5">
<span>WORD1</span><span>WORD2</span>
</div>
</p>
<p>
WORD3 WORD4
</p>
<p>
<div class="ST" data-start="6" data-end="10">
<span>WORD5</span><span>WORD6</span>
</div>
</p>
我的目标是将单词 WORD3
和 WORD4
放在 <div>
标签中,例如 WORD1
WORD2
和 WORD5
WORD6
第一个和最后一个 <p>
标签。另外,我需要得到前一个 p > div
的 data-start
data-end
并最终得到这个:
$String =
<p>
<div class="ST" data-start="1" data-end="5">
<span>WORD1</span><span>WORD2</span>
</div>
</p>
<p>
<div class="ST" data-start="1" data-end="5">
WORD3 WORD4
</div>
</p>
<p>
<div class="ST" data-start="6" data-end="10">
<span>WORD5</span><span>WORD6</span>
</div>
</p>
我设法把WORD3和WORD4放在一个<div>
中,但我不知道如何得到前一个元素p > div
和他的属性data-start
和data-end
...
我的代码:
public function reverseTransform($value) {
$dom = new DOMDocument();
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadHTML($value);
$pTags = $dom->getElementsByTagName('p');
$TagFull='';
foreach ($pTags as $pTag) {
$valuePTagFull = $this->DOMinnerHTML($pTag);
if (strpos($valuePTagFull,'<div') === false) {
$valuePTagFull = "<div class='st'>".$valuePTagFull."</div>";
}
$TagFull .= $valuePTagFull;
}
}
private function DOMinnerHTML(DOMNode $element)
{
$innerHTML = "";
$children = $element->childNodes;
foreach ($children as $child) {
$innerHTML .= $element->ownerDocument->saveHTML($child);
}
return $innerHTML;
}
事实上,对于每个 <p>
其中有 WORDx
但没有 <div>
,我将 WORDx
包装在 <div>
和 data-start
和 data-end
属性的前一个 <p> >> <div>
但是如何 select 并使用 DOM、XML 或其他方式从前一个元素获取属性?
谢谢!
我想您可以使用正则表达式获取开始结束的最后一个值,但不会使用 DOM。
if (strpos($valuePTagFull,'<div') === false) {
$valuePTagFull = "<div class='st' data-start=".$matches[1]." data-end=".$matches[2].">".$valuePTagFull."</div>";
}
else{
preg_match('~<div[^>]*?class="ST"[^>]*?data-start="(\d*?)" data-end="(\d*?)">~',$valuePTagFull,$matches);
}
$TagFull .= $valuePTagFull;