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

如何匹配PHP preg_split样式正则表达式中的一个或多个字母,php,regex,Php,Regex,我的正则表达式有问题 我想捕捉,我需要的是里面的东西 这个正则表达式对此非常有效 $matches = preg_split("/<%[\s]*(.*?)[\s]*%>/i",$markup,-1,(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)); $matches=preg_split(//i),$markup,-1,(preg_split_NO_EMPTY | preg_split_DELIM_CAPTURE)); 我还想

我的正则表达式有问题

我想捕捉,我需要的是里面的东西

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

$matches = preg_split("/<%[\s]*(.*?)[\s]*%>/i",$markup,-1,(PREG_SPLIT_NO_EMPTY  |  PREG_SPLIT_DELIM_CAPTURE));
$matches=preg_split(//i),$markup,-1,(preg_split_NO_EMPTY | preg_split_DELIM_CAPTURE));
我还想捕捉
&;%一些东西%&;燃气轮机所以我需要捕获
或%&;燃气轮机分别为

如果我放入第二组paren,它会使preg_split函数不同(因为从标志中可以看到,我试图捕获paren中的内容)

最好只匹配
<;to&;gt;和
,但这不是完全必要的


编辑:主题可能包含多个匹配项,我需要所有匹配项。在您的情况下,最好使用preg_match及其附加参数和括号:

preg_match("#((?:<|&lt;)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|&gt;))#i",$markup, $out);
print_r($out);

Array
(
    [0] => <% your stuff %>
    [1] => <%
    [2] => your stuff
    [3] => %>
)
preg#u match((?:)#i“,$markup,$out);
打印(输出);
排列
(
[0] => 
[1] =>你的东西
[3] => %>
)
顺便说一下,检查这个在线工具来调试PHP regexp,它非常有用

编辑:我对regexp进行了一些黑客攻击,因此速度更快。经过测试,它可以工作:-)

现在让我们来解释所有这些东西:

  • 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.
#((?:|)我可以被视为((?:|)。
((?:|)正在捕获%,然后<或
([\s]*(?:[^248]*)[\s]*?)表示0个或多个空格,然后是不是ø符号的0倍或更多倍,即0个或多个空格。
为什么我们用[^248]代替?因为。非常耗时,regexp引擎将检查所有现有字符。[^248]只需检查字符是否为空即可。没有人使用ø,它是一个国际货币符号,但如果你介意,你可以用chr(7)来代替它,chr(7)是shell bell char,显然永远不会在网页中键入


编辑2:我刚刚读了你关于捕获所有匹配项的编辑。在这种情况下,您将以相同的方式使用preg\u match\u。

一个可能的解决方案是使用额外的参数,就像这样,但要在结果中删除这些参数,因此实际上您只使用了总结果的1/2

这个正则表达式

$matches = preg_split("/(<|&lt;)%[\s]*(.*?)[\s]*%(>|&gt;)/i",$markup,-1,(PREG_SPLIT_NO_EMPTY  |  PREG_SPLIT_DELIM_CAPTURE));
$matches=preg_split(“/(|))/i,$markup,-1,(preg_split_NO_EMPTY | preg_split_DELIM_CAPTURE));
输入

Hi my name is <h1>Issac</h1><% some stuff %>here&lt;% more stuff %&gt; 
你好,我的名字是Issachere%more stuff%
产出将是

Array(
 [0]=>Hi my name is <h1>Issac</h1>
 [1]=><
 [2]=>some stuff
 [3]=>>
 [4]=>here
 [5]=>&;lt;
 [6]=>more stuff
 [7]=>&gt;
)
数组(
[0]=>嗨,我叫伊萨克
[1]=><
[2] =>一些东西
[3]=>>
[4] =>这里
[5] =>&;lt;
[6] =>更多东西
[7]=>
)

如果我只使用偶数,那会得到想要的结果。如果你真正想要的是括号内的匹配项,为什么要使用
preg\u split
?似乎只使用
preg\u match
会更简单

正则表达式经常存在这样一个问题:paren用于对逻辑进行分组和捕获模式

根据PHP文档中关于正则表达式的语法

普通括号实现两个功能的事实并不总是有用的。有时需要分组子模式而不需要捕获。如果左括号后接“?:”,则子模式不执行任何捕获,并且在计算任何后续捕获子模式的数量时不进行计数


如果要匹配,请使用
preg\u match\u all
正则表达式拍摄,如下所示:

preg_match_all('/((\<\%)(\s)(.*?)(\s)(\%\>))/i', '<% wtf %> <% sadfdsafds %>', $result);
preg\u match\u all('/(\)/i','$result);
这导致了太阳下几乎所有东西的匹配。您可以添加/删除参数以匹配更多/更少:

Array
(
 [0] => Array
    (
        [0] => <% wtf %>
        [1] => <% sadfdsafds %>
    )

[1] => Array
    (
        [0] => <% wtf %>
        [1] => <% sadfdsafds %>
    )

[2] => Array
    (
        [0] => <%
        [1] => <%
    )

[3] => Array
    (
        [0] =>  
        [1] =>  
    )

[4] => Array
    (
        [0] => wtf
        [1] => sadfdsafds
    )

[5] => Array
    (
        [0] =>  
        [1] =>  
    )

[6] => Array
    (
        [0] => %>
        [1] => %>
    )

)
数组
(
[0]=>阵列
(
[0] => 
[1] => 
)
[1] =>阵列
(
[0] => 
[1] => 
)
[2] =>阵列
(
[0]=>阵列
(
[0] =>  
[1] =>  
)
[4] =>阵列
(
[0]=>wtf
[1] =>sadfdsafds
)
[5] =>阵列
(
[0] =>  
[1] =>  
)
[6] =>阵列
(
[0] => %>
[1] => %>
)
)
preg_match_all('/((\<\%)(\s)(.*?)(\s)(\%\>))/i', '<% wtf %> <% sadfdsafds %>', $result);
Array
(
 [0] => Array
    (
        [0] => <% wtf %>
        [1] => <% sadfdsafds %>
    )

[1] => Array
    (
        [0] => <% wtf %>
        [1] => <% sadfdsafds %>
    )

[2] => Array
    (
        [0] => <%
        [1] => <%
    )

[3] => Array
    (
        [0] =>  
        [1] =>  
    )

[4] => Array
    (
        [0] => wtf
        [1] => sadfdsafds
    )

[5] => Array
    (
        [0] =>  
        [1] =>  
    )

[6] => Array
    (
        [0] => %>
        [1] => %>
    )

)