PHP Preg_march_all 搜索顺序不重要的多个项目
PHP Preg_march_all searching mulitple items with order not important
我想在单个字符串中匹配 2 个结果,两者都需要存在才能返回某些内容,但它们在字符串中的顺序并不重要。
$row = '[one]This[/one][two]That[/two]';
preg_match_all('#(\[one\](.*?)\[/one\])(\[two\](.*?)\[/two\])#', $row, $result_match);
如果是 $row。
$row = '[two]That[/two][one]This[/one]';
preg_match_all 是否有可能找到结果。
我需要捕获 THAT 和 THIS 并知道它是在一个还是两个里面。捕获一个和两个或仅捕获一个或两个中的一个会告诉我文本在哪个里面。
更新:
我最终确定的结果是:
#[(?!)((?:one|two))](.*?)[\/]#
此新功能发布后的用户现在希望能够嵌套命令。我尝试将 ?:one|two 更改为 ?!.one|two 以使用否定期待来匹配字符串中的最终结果。
他们希望能够做到这一点:
[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]
用户一次完成所有操作 post,他们希望能够进行嵌套运行。
期望的结果是..
[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 结果来处理嵌套运行。这可能吗?
您可以将此正则表达式与否定前瞻、捕获组和 back-reference:
一起使用
~(?:.*?\[(?!)([12])\].*?\[/\]){2}~
正则表达式说明:
(?:
: 开始一个non-capture组
.*?
:匹配0个或多个字符(non-greedy)
\[
:匹配[
(?!)
:断言我们前面没有与back-reference</code>相同的文本</li>
<li><code>([12])
:匹配1
或2
并在组#1 中捕获
\]
:匹配]
.*?
:匹配0个或多个字符(non-greedy)
\[
:匹配[
/
:使用back-reference,匹配与捕获组#1 中相同的文本
\]
:匹配]
)
: 结束non-capture组
{2}
: 匹配以上non-capture组的2个实例
更新二:
在您更新上述正则表达式后,您将无法再使用它,因为您想在标签之间捕获文本。您可以使用:这个正则表达式:
~(?|\[one\](.*?)\[/one\].*?\[two\](.*?)\[/two\]|\[two\](.*?)\[/two\].*?\[one\](.*?)\[/one\])~
您捕获的组在#1 和#2 中可用。
更新 3:
根据最近的对话,您可以使用此递归正则表达式来匹配最外层 [run]
和 [/run]
标签之间的 bbcode 数据:
$re = '~\[(run)] ( (?: (?: (?! \[/?] ) . )* | (?R) )* ) \[/]~sx';
我想在单个字符串中匹配 2 个结果,两者都需要存在才能返回某些内容,但它们在字符串中的顺序并不重要。
$row = '[one]This[/one][two]That[/two]';
preg_match_all('#(\[one\](.*?)\[/one\])(\[two\](.*?)\[/two\])#', $row, $result_match);
如果是 $row。 $row = '[two]That[/two][one]This[/one]';
preg_match_all 是否有可能找到结果。
我需要捕获 THAT 和 THIS 并知道它是在一个还是两个里面。捕获一个和两个或仅捕获一个或两个中的一个会告诉我文本在哪个里面。
更新:
我最终确定的结果是:
#[(?!)((?:one|two))](.*?)[\/]#
此新功能发布后的用户现在希望能够嵌套命令。我尝试将 ?:one|two 更改为 ?!.one|two 以使用否定期待来匹配字符串中的最终结果。
他们希望能够做到这一点:
[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]
用户一次完成所有操作 post,他们希望能够进行嵌套运行。 期望的结果是..
[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 结果来处理嵌套运行。这可能吗?
您可以将此正则表达式与否定前瞻、捕获组和 back-reference:
一起使用~(?:.*?\[(?!)([12])\].*?\[/\]){2}~
正则表达式说明:
(?:
: 开始一个non-capture组.*?
:匹配0个或多个字符(non-greedy)\[
:匹配[
(?!)
:断言我们前面没有与back-reference</code>相同的文本</li> <li><code>([12])
:匹配1
或2
并在组#1 中捕获
\]
:匹配]
.*?
:匹配0个或多个字符(non-greedy)\[
:匹配[
/
:使用back-reference,匹配与捕获组#1 中相同的文本
\]
:匹配]
)
: 结束non-capture组{2}
: 匹配以上non-capture组的2个实例
更新二:
在您更新上述正则表达式后,您将无法再使用它,因为您想在标签之间捕获文本。您可以使用:这个正则表达式:
~(?|\[one\](.*?)\[/one\].*?\[two\](.*?)\[/two\]|\[two\](.*?)\[/two\].*?\[one\](.*?)\[/one\])~
您捕获的组在#1 和#2 中可用。
更新 3:
根据最近的对话,您可以使用此递归正则表达式来匹配最外层 [run]
和 [/run]
标签之间的 bbcode 数据:
$re = '~\[(run)] ( (?: (?: (?! \[/?] ) . )* | (?R) )* ) \[/]~sx';