找到标签之间的一切

时间:2017-01-29 13:22:22

标签: php regex

我试图找到两个标签之间的所有内容,即使标签中有相同的标签(有点奇怪的解释)。

这里有一个例子: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

1 个答案:

答案 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);