您的正则表达式存在一些问题。
首先,正如 FrankeTheKneeMan 指出的那样,您需要分隔符。#
是 HTML 匹配的好选择(标准选择是/
,但它经常干扰标签):
'#[/*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*/].*[/*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*/]#'
现在虽然[.]
是转义单个字符的好方法,但对于[/*]
. 这是一个字符类,匹配/
或*
。对[*/]
. 改用这个:
'#/[*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/.*/[*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/#'
现在.*
是剩下的问题。实际上也有,一个是关键的,另一个可能不是。第一个是.
默认不匹配换行符。您可以使用s
(singleline) 修饰符来更改它。第二个,*
就是贪心。如果一个部分在字符串中出现两次,您将获得从第一个对应/* record
到最后一个对应的所有内容/* record_end
,即使两者之间存在不相关的内容。由于您的记录似乎非常具体,我想情况并非如此。但是,通常最好的做法是使量词不贪婪,以使其消耗尽可能少。这是您的最终正则表达式字符串:
'#/[*]\s*record\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/.*?/[*]\s*record_end\s*specific_number[.]specific_string1[.]specific_string2\s*[*]/#s'
对于您提出的示例,这是
'#/[*]\s*record\s*863[.]content[.]en\s*[*]/.*?/[*]\s*record_end\s*863[.]content[.]en\s*[*]/#s'
如果你想找到所有这些部分,那么你可以 make863
和variable 捕获它们(使用括号)content
并en
使用反向引用来确保你得到相应的record_end
:
'#/[*]\s*record\s*(\d+)[.](\w+)[.](\w+)\s*[*]/.*?/[*]\s*record_end\s*\1[.]\2[.]\3\s*[*]/#s'