【发布时间】:2014-07-10 19:08:36
【问题描述】:
有没有什么简单的方法可以在 2 个带有错误 XML 的标签之间查找文本并忽略嵌套?
鉴于此内容:
<div>
Some content 1
</
<some:tag>
Section 1
</some:tag>
<b>Some content 2
<some:tag>
Section 2
<some:tag>
Section 3
</some:tag>
</some:tag>
Some content 3
</p>
</div>
注意:它是故意格式错误的。我不能/不想使用正确的 HTML/XML 解析器,因为我的内容格式不正确,或者在某些情况下甚至不是 XML。同样,我不能/不想对其进行整理,因为它并不总是 HTML/XML。
所以我需要找到<some:tag>和</some:tag>之间的文字,包括嵌套标签。
以上内容会导致:
array (size=2)
0 => string '<some:tag>
Section 1
</some:tag>' (length=52)
1 => string '<some:tag>
Section 2
<some:tag>
Section 3
</some:tag>
</some:tag>' (length=125)
你尝试过什么:
我曾尝试使用 strpos/substr 提取匹配项,但我对逻辑有点迷失:
function findSomeTag($str) {
$result = [];
$startTag = "<some:tag>";
$endTag = "</some:tag>";
$offset = 0;
$start = strpos($str, $startTag, $offset);
while ($start !== false) {
$nextStart = strpos($str, $startTag, $start + 1);
$nextEnd = strpos($str, $endTag, $start + 1);
if ($nextStart === false || $nextEnd < $nextStart) {
$result[] = substr($str, $start, $nextEnd - $start + strlen($endTag));
}
$start = $nextStart;
}
return $result;
}
(注意:上面的函数完全不起作用,可能会死循环。)
【问题讨论】:
标签: php xml parsing xml-parsing html-parsing