gpt4 book ai didi

php - 这些正则表达式模式不同吗?

转载 作者:可可西里 更新时间:2023-11-01 12:52:32 24 4
gpt4 key购买 nike

我一直在处理的一个网站不会使用 PHP (preg_match) 正则表达式模式来匹配数据,这种模式似乎在我测试过的其他任何地方都有效。该模式是:

<channel.*?>(.*?)</channel>

它与具有 channel 标签的 RSS 提要相匹配。

现在我正在使用的服务器只有在将其更改为以下内容时才会产生正确的结果:

<channel.*?>(.*)?</channel>

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

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

提前感谢您的任何见解。

最佳答案

声明 (.*) 表示“选择是零个或多个字符”,尾随 ? 使其成为可选匹配项。相比之下,(.*?) 使用的是“懒星”(*?),它首先尝试完全跳过匹配。检查this获取更多信息。

要了解普通(贪婪)星形和惰性星形之间的区别,请查看以下 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
)
*/

关于php - 这些正则表达式模式不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11139753/

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