Php 递归获取嵌套匹配字符之间的所有文本
这是一个示例输入字符串:Php 递归获取嵌套匹配字符之间的所有文本,php,regex,preg-match-all,Php,Regex,Preg Match All,这是一个示例输入字符串: (#1662#-#[Réz-de-chausseée][Thermostate][Temperature Actuel]>4)和&&Ԙ#==1和#[Aucun][Template][ReviseConfort#templateSuffix][code> 以下是所需的输出字符串: #1662# #[Réz-de-chaussée][Thermostate][Temperature Actuel]# #1304# #[Aucun][Template][Revise
(#1662#-#[Réz-de-chausseée][Thermostate][Temperature Actuel]>4)和&&Ԙ#==1和#[Aucun][Template][ReviseConfort#templateSuffix][code>
以下是所需的输出字符串:
#1662#
#[Réz-de-chaussée][Thermostate][Temperature Actuel]#
#1304#
#[Aucun][Template][ReviseConfort#templateSuffix#]#
我试过这个正则表达式,但不起作用:
~("|\').*?\1(*SKIP)(*FAIL)|\#(?:[^##]|(?R))*\#~
试试这个
说明:
(?:
// Grabs everything between 1 opening # and 1 closing # tag that`s not #[ chars
#[^#[]+#|
// Grabs everything between 2 opening # and 2 closing ]# tags
##(?:.+?]#){2}|
// Grabs everything between 1 opening # and 1 closing ]# tag
#(?:.+?]#){1}
)
(?:
//抓住1个开始和1个结束之间的所有标记,该标记不是[chars]
#[^#[]+#|
//抓取2个开始标记和2个结束标记之间的所有内容
##(?:.+?]#){2}|
//抓住1个开始#和1个结束#标记之间的所有内容
#(?:.+?]#){1}
) 试试这个
说明:
(?:
// Grabs everything between 1 opening # and 1 closing # tag that`s not #[ chars
#[^#[]+#|
// Grabs everything between 2 opening # and 2 closing ]# tags
##(?:.+?]#){2}|
// Grabs everything between 1 opening # and 1 closing ]# tag
#(?:.+?]#){1}
)
(?:
//抓住1个开始和1个结束之间的所有标记,该标记不是[chars]
#[^#[]+#|
//抓取2个开始标记和2个结束标记之间的所有内容
##(?:.+?]#){2}|
//抓住1个开始#和1个结束#标记之间的所有内容
#(?:.+?]#){1}
) 这种情况并不特别适合递归。最好使用普通正则表达式
很难确定以下内容是否适用于所有其他可能的输入,因为您只提供了两个有限的示例
至少在这些示例中,所需的结束符#
后面是)
、空格或行尾。使用这些值的负前瞻性可以捕获内部嵌套的
:
#(?:[^#]|#(?![\s)]|$))+#
这种情况并不特别适合递归。最好使用普通正则表达式
很难确定以下内容是否适用于所有其他可能的输入,因为您只提供了两个有限的示例
至少在这些示例中,所需的结束符#
后面是)
、空格或行尾。使用这些值的负前瞻性可以捕获内部嵌套的
:
#(?:[^#]|#(?![\s)]|$))+#
很抱歉,我第一次编辑的示例没有错误。前后的分隔符carcte是#。恐怕您的问题不清楚,因为您的模式尝试匹配的内容与示例输入之间存在明显差异。请提供更真实的示例输入,或者更好的示例输入,以更好地表示您将遇到的字符串类型,从而改进您的问题。很抱歉,我在第一次编辑中的示例没有包含错误。前后的分隔符carcte是#。恐怕您的问题不清楚,因为您的模式尝试匹配的内容与示例输入之间存在明显差异。请提供更真实的示例输入,或者更好的示例输入,以更好地表示您将遇到的字符串类型,从而改进您的问题。这样做很好,但不是为了适应新的情况,现在检查工作正常,但不是为了这个,返回是为了适应新情况,现在检查