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

标签 php regex

我的正则表达式有问题。

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

此正则表达式对此非常有效。

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

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

如果我放入第二组括号,它会使 preg_split 的功能不同(因为正如您从标志中看到的那样,我正在 try catch 括号内的内容。

最好,它只匹配 &amp;lt; to &amp;gt; and < to >也一样,但这不是完全必要的

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

最佳答案

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

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

详细的模式:

#((?:<|&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.

为什么我们使用 [^ø] 而不是 . ?这是因为 。非常耗时,正则表达式引擎将检查所有现有字符。 [^ø] 只检查字符是否不是ø。没有人使用 ø,它是一个国际货币符号,但如果您在意,可以将其替换为 chr(7),这是一个显然永远不会在网页中输入的 shell bell 字符。

EDIT2:我刚刚阅读了您关于捕获所有匹配项的编辑。在这种情况下,您将以相同的方式使用 preg_match_all。

关于php - 如何在 PHP preg_split 样式正则表达式中匹配一个或多个字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/104238/

相关文章:

php - 创建 PHP future 日期的更好方法

php - 防止访问除一个之外的所有 php 文件,而不将文件放在单独的文件夹中

用于整数和小数的 javascript 正则表达式(金钱)

regex - emacs 交互式搜索 search-forward-regexp 区别

php - 在 Sphinx 中使用 SPH_SORT_RELEVANCE 时,权重相等的结果如何排序?

php - 隐藏 Woocommerce 订阅价格中的 “free trial” 文本,但保留注册费

php - 如何使用 PHP 向多个用户发送消息

php - 如何通过键的一部分过滤数组?

html - 具有最大长度的电子邮件地址正则表达式

javascript - 如何从某个地方开始拆分字符串?