Php,正则表达式
我得到了这个模式(我正在使用php): 搜索此字符串时:Php,正则表达式,php,regex,Php,Regex,我得到了这个模式(我正在使用php): 搜索此字符串时:http://phpquest.zapto.org/users/register.php 匹配项为(顺序为0-5): ”[链接=http://phpquest.zapto.org/users/register.php]“ 'http://phpquest.zapto.org/users/register.php“ 'http://' 'phpquest.zapto' org ” 当我将最后一个子模式中的*替换为+时,如下所示: '/\[li
http://phpquest.zapto.org/users/register.php
匹配项为(顺序为0-5):
”[链接=http://phpquest.zapto.org/users/register.php]“
'http://phpquest.zapto.org/users/register.php“
'http://'
'phpquest.zapto'
org
”
*
替换为+
时,如下所示:
'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]+)*\/?)\]/i'
匹配项为(顺序为0-5):
”[链接=http://phpquest.zapto.org/users/register.php]“
'http://phpquest.zapto.org/users/register.php“
'http://'
'phpquest.zapto'
org
'/users/register.php'
如果有人能帮我理解为什么,我会非常感激,谢谢大家,祝你们有一个愉快的一天。这可以通过以下模式简化
/\[link=(https?:\/\/)(([a-z0-9]+\.?)+)((\/[^\/]+)+)\/?\]/i
正则表达式符号
*
不是贪婪的,而+
是贪婪的。因此,当在第二次尝试中使用+
时,所有路径组件都被匹配,并且该组被捕获;但是,在使用*
的第一次尝试中,由于您只捕获了带有括号的内部*
组,因此您匹配了*
的非贪婪样本,在本例中,没有任何匹配。可能一个更简单的示例是当您与进行比较时
涉及的正则表达式包括:
(a*)*
及
测试字符串是aaaaaa
发生的情况是,在捕获主组(在我提供的示例中,是a
系列)后,它尝试匹配更多,但无法匹配。但是等等!它也可以不匹配,因为*
表示0次或更多次
因此,在匹配所有a
之后,它将匹配并捕获一个“nothing”,因为只存储了最后捕获的部分,所以捕获组的结果是“”
在
(a+*
)中,在匹配和捕获aaaaaa
之后,它无法匹配或捕获更多内容(+
阻止它不匹配任何内容,而不是*
),因此,aaaaaa
是最后一个匹配项。为什么这是
-尝试指定您的问题。为什么不使用解析url
?不要重新发明轮子,我们知道它们是如何工作的。我可能会使用它。我确实看了一下,但我确实想了解原因,谢谢这可能不是正则表达式的工作,而是您选择的语言中的现有工具的工作。正则表达式并不是一根魔杖,你在遇到每一个涉及字符串的问题时都会挥舞它。您可能希望使用已经编写、测试和调试的现有代码。在PHP中,使用函数。Perl:。鲁比:。NET:谢谢你在我在Frits van Campen上展示后的评论,我将使用parse_url,但我想了解。谢谢你,matt,但是你能解释一下为什么我问题上的模式没有在*上显示最后一个子模式,并且+它是doe。这不是问题的答案,是吗?作者问“它为什么会这样?”而不是“如何让它更好”杰瑞非常感谢现在我明白了,很好地解释了答案再次感谢,祝你有一个愉快的一天。
(a*)*
(a+)*