嗯,我知道有几个类似的问题,但无法找到任何与此特定情况。preg匹配标签之间的标签之间的相同标签
我拿了一个代码,并根据我的需要调整它,但现在我创建了一个我无法修正的错误。
代码:
$tag = 'namespace';
$match = Tags::get($f, $tag);
var_dump($match);
static function get($xml, $tag) { // http://stackoverflow.com/questions/3404433/get-content-within-a-html-tag-using-7-processing
// bug case string(56) "<namespaces>
// <namespace key="-2">Media</namespace>"
$tag_ini = "<{$tag}[^\>]*?>"; $tag_end = "<\\/{$tag}>";
$tag_regex = '/' . $tag_ini . '(.*?)' . $tag_end . '/si';
preg_match_all($tag_regex,
$xml,
$matches,
PREG_OFFSET_CAPTURE);
return $matches;
}
正如你所看到的,但如果该标签被嵌套了一个错误:
<namespaces> <namespace key="-2">Media</namespace>
当它应该返回 '媒体',或即使在外面'<namespaces>'
,然后在里面。
我试着添加“<{$tag}[^\>|^\r\n ]*?>
”,^\s+
,将*改成* *,以及其他一些在最好的情况下转而只识别错误情况的东西。
也试过"<{$tag}[^{$tag}]*?>"
这给了空白,我想它会自行消失。
我是一个正则表达式的新手,我可以告诉解决这个问题只是需要添加不要让一个新的标签打开同一个类型。 或者我甚至可以对我的使用案例使用黑客答案,即排除内部文本是否有新的线条托架。
任何人都可以得到正确的语法吗?
您可以查看这里的文字摘录:http://pastebin.com/f2naN2S3
提议的变更后:$tag_ini = "<{$tag}\\b[^>]*>"; $tag_end = "<\\/{$tag}>";
它的工作的例子的情况下,但不是这一个:
<namespace key="0" />
<namespace key="1">Talk</namespace>
因为它导致:
<namespace key="1">Talk"
这是因为数字和“和字母被认为是在字边界内。我怎么解决这个问题?
目前正在努力:$ tag_regex = '/'。 $ tag_ini。 “[^ {$ tag_ini}] *?” 。 $ tag_end。 '/ SI'; – Cristo
如果您对此表示歉意,您可以评论它不是一个好问题的原因 – Cristo
但是,如果您尝试使用正则表达式处理XML,那么对于一个很好的描述和一个片段,可能会出现更多的关于此问题的提示。至于你为什么得到命名空间标签,你没有使用单词边界:'$ tag_ini =“<{$tag}\\b[^>] *>”;'。然而,这不会解决嵌套标签的问题,你需要一个[递归正则表达式](http://www.regular-expressions.info/recurse.html)。不过,你最好使用DOM解析来解析标签之间的内容。 –