如何匹配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("#((?:<|<)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|>))#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中
具体模式如下:
#((?:<|<)%)([\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.
#((?:|)我可以被视为((?:|)。
((?:|)正在捕获%,然后<或
([\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("/(<|<)%[\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));
输入
Hi my name is <h1>Issac</h1><% some stuff %>here<% more stuff %>
你好,我的名字是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]=>>
)
数组(
[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] => %>
)
)