gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:47:02 25 4
gpt4 key购买 nike

我的正则表达式有问题。

我想捕获 <% 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com