Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php,正则表达式_Php_Regex - Fatal编程技术网

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

我得到了这个模式(我正在使用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
  • 当我将最后一个子模式中的
    *
    替换为
    +
    时,如下所示:

    '/\[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+)*