这些正则表达式模式有何不同?

Vun*_*nus 7 php regex preg-match

我一直在研究的网站不会使用PHP(preg_match)正则表达式模式匹配数据,这种模式似乎适用于我测试过的其他地方.那种模式是:

<channel.*?>(.*?)</channel>
Run Code Online (Sandbox Code Playgroud)

它与具有频道标记的RSS源匹配.

现在我正在处理的服务器只有在将其更改为时才会产生正确的结果:

<channel.*?>(.*)?</channel>
Run Code Online (Sandbox Code Playgroud)

我的正则表达式不是世界上最好的,所以我想知道是否有人可以告诉我这两种模式之间是否存在任何显着差异.

小记:我意识到使用SimpleXML等可能会更好,但这个正则表达式来自之前的应用程序,由于各种原因我不允许更改它.

提前感谢任何见解.

And*_*zak 7

声明(.*)说"选择是零个或多个字符",尾随?使它成为可选匹配.相比之下,(.*?)正在使用"懒星"(*?),它首先尝试完全跳过比赛.请查看以获取更多信息.

要了解一个正常(贪婪),星和一个懒惰的明星之间的差别,看看PHP下面的例子并注意贪婪星使得它能够与它被赋予的模式最大的比赛,而懒之星"放弃"一旦满足匹配模式:

$inputs = array( 'axb' , 'axxxb' , 'axbxb' , 'axbxxxb' );

// GREEDY STAR (NORMAL)
foreach( $inputs as $input )
{
  preg_match( '/a.*b/' , $input , $greedy );
  $greedy_matches[] = $greedy[0];
}

print "<pre>";
print_r( $greedy_matches );
print "</pre>";
/* 
Array
(
    [0] => axb
    [1] => axxxb
    [2] => axbxb
    [3] => axbxxxb
)
*/



// LAZY STAR
foreach( $inputs as $input )
{
  preg_match( '/a.*?b/' , $input , $lazy );
  $lazy_matches[] = $lazy[0];
}

print "<pre>";
print_r( $lazy_matches );
print "</pre>";
/* 
Array
(
    [0] => axb
    [1] => axxxb
    [2] => axb
    [3] => axb
)
*/
Run Code Online (Sandbox Code Playgroud)