Php 正则表达式中的问号

Php 正则表达式中的问号,php,regex,Php,Regex,我看到这个正则表达式在url上执行: $url = 'http://www.domain.com/'; preg_match('/(http)(.*?)\n/', $url, $matches); 我不确定问号“?”在这个正则表达式中的用法。根据正则表达式手册,“?”是一个元字符,相当于{0,1}。那么,在*后面加“?”有什么意义呢?因为*已经表示{0,} 谁能给我点化一下吗。谢谢。在这种情况下,问号表示“吝啬”匹配。它将在遇到第一个\n时立即停止匹配,否则,它将吞噬介入的\n直到最后一个 更

我看到这个正则表达式在url上执行:

$url = 'http://www.domain.com/';
preg_match('/(http)(.*?)\n/', $url, $matches);
我不确定问号“?”在这个正则表达式中的用法。根据正则表达式手册,“?”是一个元字符,相当于{0,1}。那么,在*后面加“?”有什么意义呢?因为*已经表示{0,}


谁能给我点化一下吗。谢谢。

在这种情况下,问号表示“吝啬”匹配。它将在遇到第一个
\n
时立即停止匹配,否则,它将吞噬介入的
\n
直到最后一个


更多关于贪婪和吝啬匹配的信息,请参见

当它跟在另一个量词后面时,它有不同的含义

在这种情况下,它会改变前面量词的匹配行为。默认行为是贪婪的,
将其更改为“ungreedy”

  • “贪婪”意味着尽可能地匹配

  • “Ungreedy”指尽可能少的匹配

例如:

a.+b
将匹配aabxb

a.+?b
将只匹配aabxb

参见示例

您可能会对我关于此主题的博文感兴趣:

关于您的正则表达式

preg_match('/(http)(.*?)\n/', $url, $matches);
我不认为这有什么区别。默认情况下,
匹配除换行符以外的任何字符(您可以通过在结束正则分隔符后添加一个
s
来更改此设置),因此,如果问号是否存在,它将只匹配到第一个
\n


如果使用
preg_match('/(http)(.*?\n/s'),$url,$matches)更改行为,它将带来不同
*\n
将匹配到最后一个
\n
*?\n
将在第一个
\n

检查一下……可能会有帮助@Dikku,这个问题完全无关。@tonytz,不客气,我还为您的特殊情况添加了解释。啊,我明白了。添加的解释也非常有用-事实上,它解决了文件末尾的行时的问题!