PHP Preg_march_all搜索订单不重要的多项

时间:2018-03-28 03:37:00

标签: php regex preg-match-all

我希望在单个字符串中匹配2个结果,两者都需要存在才能返回,但它们在字符串中的顺序并不重要。

 $row = '[one]This[/one][two]That[/two]';
 preg_match_all('#(\[one\](.*?)\[/one\])(\[two\](.*?)\[/two\])#', $row, $result_match);

如果是$ row。      $ row =' [two]那[/ two] [one]这个[/ one]';

无论如何,preg_match_all都可以找到结果。

我需要捕获这个和那个,并知道它是否在一两个内。同时捕获一个或两个或只捕获一个或两个中的一个会告诉我文本在哪个内部。

更新

我决定的最终结果是:

#[(?!\1)((?:one|two))](.*?)[\/\1]# 

现在发布此新功能后的用户希望能够嵌套命令。我试过改变?:one | two to?!。one | 2使用负向期待匹配字符串中的最终结果。

他们希望能够做到这一点:

[one]This[one]This Again[/one][two]That Again[/two][/one][two]That[/two]

所需的捕获将是

This[one]This Again[/one][two]That Again[/two]

[two]That[/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]

我可以预先处理嵌套运行的结果。这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

您可以将此正则表达式用于负前瞻,捕获组和反向引用:

~(?:.*?\[(?!\1)([12])\].*?\[/\1\]){2}~

RegEx Demo 1

正则表达式描述:

  • (?::启动非捕获组
    • .*?:匹配0个或更多字符(非贪婪)
    • \[:匹配[
    • (?!\1):断言我们没有与前面的\1相同的文字
    • ([12]):匹配12并在第1组中捕获
    • \]:匹配]
    • .*?:匹配0个或更多字符(非贪婪)
    • \[:匹配[
    • /\1:使用反向引用,匹配与捕获组#1相同的文本
    • \]:匹配]
  • ):结束非捕获组
  • {2}:匹配上述非捕获组的2个实例

更新2:

在您更新之后,正如您要在标记之间捕获文本一样,正则表达式将不再起作用。你可以使用:这个正则表达式:

~(?|\[one\](.*?)\[/one\].*?\[two\](.*?)\[/two\]|\[two\](.*?)\[/two\].*?\[one\](.*?)\[/one\])~

您捕获的群组在#1和#2中可用。

RegEx Demo 2

更新3:

根据最近的对话,您可以使用此递归正则表达式来匹配最外面的[run][/run]标记之间的bbcode数据:

$re = '~\[(run)] ( (?: (?: (?! \[/?\1] ) . )* | (?R) )* ) \[/\1]~sx';

Read more about recursive patterns

RegEx Demo 3