Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Preg_march_所有搜索订单不重要的多个项目_Php_Regex_Preg Match All - Fatal编程技术网

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
      2
      并在组1中捕获
    • \]
      :匹配
      ]
    • *?
      :匹配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';