PHP Preg_march_所有搜索订单不重要的多个项目
我想在一个字符串中匹配两个结果,两个结果都需要存在才能返回某些内容,但它们在字符串中的顺序并不重要PHP Preg_march_所有搜索订单不重要的多个项目,php,regex,preg-match-all,Php,Regex,Preg Match All,我想在一个字符串中匹配两个结果,两个结果都需要存在才能返回某些内容,但它们在字符串中的顺序并不重要 $row = '[one]This[/one][two]That[/two]'; preg_match_all('#(\[one\](.*?)\[/one\])(\[two\](.*?)\[/two\])#', $row, $result_match); 如果改为$row。 $row='[two]那[/two][1]这[/1] preg_match_all是否有可能找到结果 我需要捕捉那个和
$row = '[one]This[/one][two]That[/two]';
preg_match_all('#(\[one\](.*?)\[/one\])(\[two\](.*?)\[/two\])#', $row, $result_match);
如果改为$row。
$row='[two]那[/two][1]这[/1]
preg_match_all是否有可能找到结果
我需要捕捉那个和这个,知道它是在一个还是两个里面。捕获一个和两个,或者只捕获一个或两个中的一个会告诉我文本在哪一个里面
更新:
我最终决定的结果是:
#[(?!\1)((?:one|two))](.*?)[\/\1]#
这个新功能发布后的用户现在希望能够嵌套这些命令。我试着换了?:一到两个?!。1 | 2使用负向前看匹配字符串中的最终结果
他们希望能够做到这一点:
[one]This[one]This Again[/one][two]That Again[/two][/one][two]That[/two]
理想的捕获是
This[one]This Again[/one][two]That Again[/two]
及
更新2:
这就是我正在尝试做的全部范围
[run][one]This[/one][two]That[/two][/run]
[run][one]This 2[/one][two]That 2[/two][/run]
[run][one]IF THIS RESULT DO THIS [run][one]This[/one][two]That[/two][/run][/one][two]IF THIS RESULT DO THAT [run][one]This[/one][two]That[/two][/run][/two][/run]
用户可以在一篇文章中完成这一切,他们希望能够进行嵌套运行。
预期的结果将是
[one]This[/one][two]That[/two]
[one]This 2[/one][two]That 2[/two]
[one]IF THIS RESULT DO THIS [run][one]This[/one][two]That[/two][/run][/one][two]IF THIS RESULT DO THAT [run][one]This[/one][two]That[/two][/run][/two]
我可以使用foreach结果来处理嵌套运行。这可能吗?您可以将此正则表达式与负前瞻、捕获组和反向引用一起使用:
~(?:.*?\[(?!\1)([12])\].*?\[/\1\]){2}~
正则表达式说明:
:启动非捕获组(?:
:匹配0个或更多字符(非贪婪)*?
:匹配\[
[
:声明前面的文本与后面的引用不相同(?!\1)
:匹配([12])
或1
并在组1中捕获2
:匹配\]
]
:匹配0个或更多字符(非贪婪)*?
:匹配\[
[
:使用反向引用,匹配与捕获组#1中相同的文本/\1
:匹配\]
]
:结束非捕获组)
:匹配上述非捕获组的2个实例{2}
更新2: 更新后,上面的正则表达式将不再工作,因为您希望捕获标记之间的文本。您可以使用:此正则表达式:
~(?|\[one\](.*?)\[/one\].*?\[two\](.*?)\[/two\]|\[two\](.*?)\[/two\].*?\[one\](.*?)\[/one\])~
您捕获的群可在#1和#2中找到
更新3: 根据最近的对话,您可以使用此递归正则表达式在最外层的
[run]
和[/run]
标记之间匹配bbcode数据:
$re = '~\[(run)] ( (?: (?: (?! \[/?\1] ) . )* | (?R) )* ) \[/\1]~sx';
如果你看上面,它分别捕捉了这两个方面。你在Regex方面绝对令人惊讶(但我刚刚发现你写了一本关于这个主题的书)。问题只会变得更复杂,但我希望你能帮助我,在把这一切放在一起之后,我只是进一步打破它。你很出色,如果你为php或javascript制作一个正则表达式,请告诉我,我会得到一个副本。当然,一旦我在php或javascript上发布了一些东西,我一定会让你知道。顺便说一句,这个正则表达式最终对你有用吗?100%。现在我只需要让php部分正常工作,如果运气好的话,一切都会很好。我用preg_match_all和preg_replace来替换,替换会很有趣,但我会做到的。非常感谢你的帮助。如果将来(很少)我需要regex的帮助,我绝对会去找你。通常,我只做搜索引擎优化正则表达式,我很擅长处理所有这些。但是对于像这样更高级的东西,我没有任何地方能比得上你的技能。我以为已经是了,对不起,阿努巴瓦。(我还给你留下了一篇亚马逊评论来帮助你)
$re = '~\[(run)] ( (?: (?: (?! \[/?\1] ) . )* | (?R) )* ) \[/\1]~sx';