当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在PHPpreg_split样式正则表达式中匹配一个或多个字母》经验,为你挑选了1个好方法。

我的正则表达式有问题.

我想捕获<%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;分别捕获.

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

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

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



1> e-satis..:

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

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

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

顺便说一句,检查这个在线工具来调试PHP regexp,它非常有用!

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)取代它,它是贝壳钟形物,它显然永远不会在网页上输入.

EDIT2:我刚刚阅读了关于捕捉所有比赛的编辑.在这种情况下,您将以相同的方式使用preg_match_all.

推荐阅读
围脖上的博博_771
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有