我的正则表达式有问题。
我想捕获 <% some stuff %> 并且我需要 <% 和 %> 中的内容
此正则表达式对此非常有效。
$matches = preg_split("/<%[\s]*(.*?)[\s]*%>/i",$markup,-1,(PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE));
我也想抓&% some stuff %&gt;
所以我需要捕获 <% or &lt;% and %> or %&gt;
分别。
如果我放入第二组括号,它会使 preg_split 的功能不同(因为正如您从标志中看到的那样,我正在 try catch 括号内的内容。
最好,它只匹配 &lt; to &gt; and < to >
也一样,但这不是完全必要的
编辑:主题可能包含多个匹配项,我需要所有匹配项
最佳答案
在您的情况下,最好使用带有附加参数和括号的 preg_match:
preg_match("#((?:<|<)%)([\s]*(?:[^ø]*)[\s]*?)(%(?:>|>))#i",$markup, $out);
print_r($out);
Array
(
[0] => <% your stuff %>
[1] => <%
[2] => your stuff
[3] => %>
)
顺便看看这个调试PHP正则表达式的在线工具,它非常有用!
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),这是一个显然永远不会在网页中输入的 shell bell 字符。
EDIT2:我刚刚阅读了您关于捕获所有匹配项的编辑。在这种情况下,您将以相同的方式使用 preg_match_all。
关于php - 如何在 PHP preg_split 样式正则表达式中匹配一个或多个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/104238/