我的正则表达式有问题.
我想捕获<%some stuff%>,我需要<%和%>中的内容
这个正则表达式对此非常有效.
$matches = preg_split("/<%[\s]*(.*?)[\s]*%>/i",$markup,-1,(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));
我也想抓住&% some stuff %>
所以我需要<% or <% and %> or %>
分别捕获.
如果我放入第二组parens,它会使preg_split功能不同(因为从旗帜中可以看出,我正试图捕捉到parens里面的内容.
优选地,它也只匹配< to > and < to >
,但这不是完全必要的
编辑:SUBJECT可能包含多个匹配,我需要所有匹配
在您的情况下,最好使用preg_match及其附加参数和括号:
preg_match("#((?:<|<)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|>))#i",$markup, $out); print_r($out); Array ( [0] => <% your stuff %> [1] => <% [2] => your stuff [3] => %> )
顺便说一句,检查这个在线工具来调试PHP regexp,它非常有用!
http://regex.larsolavtorvik.com/
编辑:我有点破坏正则表达式,所以它更快.测试它,它的工作原理:-)
现在让我们解释一下这些东西:
preg_match会将他捕获的所有内容存储在作为第三个参数传递的var中(此处为$ out)
如果preg_match匹配的东西,它将存储在$ out [0]
在模式中的任何内部()但不是(?:)的内容都将存储在$ out中
图案细节:
#((?:<|<)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|>))#i can be viewed as ((?:<|<)%) + ([\s]*(?:[^ø]*)[\s]*?) + (%(?:>|>)). ((?:<|<)%) is capturing < or < then % (%(?:>|>)) is capturing % then < or > ([\s]*(?:[^ø]*)[\s]*?) means 0 or more spaces, then 0 or more times anything that is not the ø symbol, the 0 or more spaces.
为什么我们使用[^ø]代替.?这是因为 .非常耗时,正则表达式引擎将检查所有现有字符.[^ø]只检查焦炭是否不是ø.没有人使用ø,它是一个国际货币符号,但如果你关心,你可以用chr(7)取代它,它是贝壳钟形物,它显然永远不会在网页上输入.
EDIT2:我刚刚阅读了关于捕捉所有比赛的编辑.在这种情况下,您将以相同的方式使用preg_match_all.