我试图找到两个标签之间的所有内容,即使标签中有相同的标签(有点奇怪的解释)。
这里有一个例子:this <tag id="1">is an <tag id="2">example</tag> for</tag> tags <tag id="3">in tags</tag>
。
我能够获得标签之间的所有内容,但不能获得与之配对的标签。
我的正则表达式如下:<tag id="(.*?)">(.*?)</tag>
如何判断我的正则表达式是否有<tag>
,然后忽略下一个</tag>
?这无限次。
因为我正在使用php,是否有更好更快的解决方案?
输出应如下所示:
id => content
- 1 => is an <tag id="2">example</tag> for
- 2 => example
- 3 => in tags
答案 0 :(得分:1)
你有一个已经结构化的字符串,其中包含一个众所周知的语法,PHP有内置的工具来解析这种语法。没有理由使用带有正则表达式或字符串函数的字符串方法。
在这个例子中,我选择DOMDocument::loadHTML
来代替DOMDocument::loadXML
以获得更宽松的解析器,但如果你有一个格式良好的XML文档,则不需要进行此更改。
我假设每个<tag>
节点都有一个id
属性,但如果情况并非如此,您可以在第一个foreach中使用DOMNode::hasAttribute
测试其存在性循环。
$html = 'this <tag id="1">is an <tag id="2">example</tag> for</tag> tags <tag id="3">in tags</tag>';
$dom = new DOMDocument;
$state = libxml_use_internal_errors(true);
$dom->loadHTML($html);
libxml_use_internal_errors($state);
$nodeList = $dom->getElementsByTagName('tag');
$results = [];
foreach ($nodeList as $node) {
$content = '';
foreach ($node->childNodes as $child) {
$content .= $dom->saveHTML($child);
}
$results[$node->getAttribute('id')] = $content;
}
print_r($results);