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