如何在PHP preg_split样式正则表达式中匹配一个或多个字母

Iss*_*lly 2 php regex

我的正则表达式有问题.

我想捕获<%some stuff%>,我需要<%和%>中的内容

这个正则表达式对此非常有效.

$matches = preg_split("/<%[\s]*(.*?)[\s]*%>/i",$markup,-1,(PREG_SPLIT_NO_EMPTY  |  PREG_SPLIT_DELIM_CAPTURE));
Run Code Online (Sandbox Code Playgroud)

我也想抓住&amp;% some stuff %&amp;gt; 所以我需要<% or &amp;lt;% and %> or %&amp;gt;分别捕获.

如果我放入第二组parens,它会使preg_split功能不同(因为从旗帜中可以看出,我正试图捕捉到parens里面的内容.

优选地,它也只匹配&amp;lt; to &amp;gt; and < to >,但这不是完全必要的

编辑:SUBJECT可能包含多个匹配,我需要所有匹配

e-s*_*tis 9

在您的情况下,最好使用preg_match及其附加参数和括号:

preg_match("#((?:<|&lt;)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|&gt;))#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/

编辑:我有点破坏正则表达式,所以它更快.测试它,它的工作原理:-)

现在让我们解释一下这些东西:

  • preg_match会将他捕获的所有内容存储在作为第三个参数传递的var中(此处为$ out)
  • 如果preg_match匹配的东西,它将存储在$ out [0]
  • 在模式中的任何内部()但不是(?:)的内容都将存储在$ out中

图案细节:

#((?:<|&lt;)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|&gt;))#i can be viewed as ((?:<|&lt;)%) + ([\s]*(?:[^ø]*)[\s]*?) + (%(?:>|&gt;)).

((?:<|&lt;)%) is capturing < or &lt; then %
(%(?:>|&gt;)) is capturing % then < or &gt; 
([\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.