PHP Regex没有按预期匹配字符串

时间:2012-08-16 14:42:02

标签: php regex

正则表达式:

https?://([a-zA-Z0-9-_]{1,50}[.])*[a-zA-z0-9-_]{1,50}[.]([(org)(gov)(com)]{3}|[(us)(fi)]{2})

测试员:

http://regex.powertoy.org/

守则:

if(preg_match_all('|https?://([a-zA-Z0-9-_]{1,50}[.])*[a-zA-z0-9-_]{1,50}[.]([(org)(gov)(com)]{3}|[(us)(fi)]{2})|',$row['text'],$links))
    {
        print_r($links[0]);
        /*for($x=0;$x<count(links[0]);$x++)
        {
            $row['text'] = str_replace($links[0][$x], 'link' . $link[0][$x] . 'link', $row['text'];
        }*/
    }else{
        echo 'Failure!';
    }

正则表达式匹配测试仪中的URL,但在HTML / PHP前端完全没有。我不确定问题是什么。无论子域的数量如何,正则表达式/代码的要点基本上都是匹配URL。

2 个答案:

答案 0 :(得分:2)

修复你的正则表达式模式是:

https?:\/\/(?:[\w-]{1,50}\.)*[\w-]{1,50}\.(?:org|gov|com|us|fi)

但我建议使用:

https?:\/\/(?:[a-zA-Z\d]+(?:\-[a-zA-Z\d]+)*\.)+(?:org|gov|com|us|fi) 

答案 1 :(得分:2)

您使用|字符作为分隔符,但您也在正则表达式中使用它。

我建议使用另一个字符并使正则表达式不区分大小写以避免出现问题,例如a-zA-z

preg_match_all('#https?://([a-zA-Z0-9-_]{1,50}[.])*[a-zA-z0-9-_]{1,50}[.]([(org)(gov)(com)]{3}|[(us)(fi)]{2})#i',$row['text'],$links)