PHP Regex preg_match显示异常行为


PHP Regex preg_match showing unusual behavior

模式如下:

$urlpattern = '%[^http://][^https://]['w]+(-['w]+)*('.['w]+(-['w]+)*)*'.['w]{1,6}('.['w]{1,6})*[^/]%';

我遇到了一个奇怪的bug,让我很困惑。

当我搜索像'power-tool-world.com'这样的字符串时,它会使它失效并返回'ower-tool-world.com'(删除p),但当我使用任何其他字母(未对其他字母进行测试)时,它工作得很好,所以'cower-tool-world.com'返回'cower-tool-world.com',请有人帮助我理解为什么,但更重要的是给我一个不会导致这个问题的解决方案?

错误在第一部分。当您使用方括号时,您匹配其中的一个字符,因此[http://]匹配h, t, p,:和/,并且这些字符将从下一个匹配组中排除。您应该使用^(http://|https://)?