正则表达式不匹配,我做错了什么?

时间:2014-11-09 18:35:01

标签: php regex

我试图在包含链接的字符串之间进行替换,并将相同的字符串封装在html href块中。我是正则表达式的新手并且一直在阅读它们 - 我已经通过SO和其他网站提出了这个表达。

$s = 'This is a stupid site: www.etsy.com';
$regEx = '#(^www\.|^http://)([a-zA-Z0-9/?\-&=_\.]+\.com|\.net|\.org|\.ca)|(/[a-zA-Z0-9/?\-_&=\.]+)#';
$ret = preg_replace( $regEx, "<a href='$1$2$3'>$1$2$3</a>", $s);
echo $ret;

这并没有给我一个链接

这并不包括&#34; http://&#34;在链接中:

$s = 'This is a stupid video http://www.youtube.com/watch?v=MkXVM6ad9nI';
$regEx = '#(^www\.|^http://)([a-zA-Z0-9/?\-&=_\.]+\.com|\.net|\.org|\.ca)|(/[a-zA-Z0-9/?\-_&=\.]+)#';
$ret = preg_replace( $regEx, "<a href='$1$2$3'>$1$2$3</a>", $s);
echo $ret;

我还在努力,所以这可能会改变......但是当我接近我的智慧时,任何帮助都会受到赞赏。

提前感谢您的时间

P.S:我在RegexBuddy中试过这个,当我测试时,整个字符串都会突出显示...所以我真的很想知道我做错了什么。

2 个答案:

答案 0 :(得分:0)

尝试:

$s = 'This is a stupid site: www.etsy.com';
$regEx = '#(www\.|http://)([a-zA-Z0-9\/?\-&=_\.]+\.com|\.net|\.org|\.ca)(/[a-zA-Z0-9/?\-_&=\.]*)?#';
$ret = preg_replace( $regEx, "<a href='$1$2$3'>$1$2$3</a>", $s);
echo $ret;

And test HERE

答案 1 :(得分:0)

你的正则表达式匹配,例如:

www.whatever.com

www.net

但不是

www.whatever.net

您必须对TLD进行分组:

$regEx = '#(^www\.|^http://)([a-zA-Z0-9/?\-&=_\.]+(\.com|\.net|\.org|\.ca))|(/[a-zA-Z0-9/?\-_&=\.]+)#';
//                                         here __^   and         here  __^

你也可以简化它:

$regEx = '#^((?:www\.|http://)[\w/.-]+\.(?:com|net|org|ca))#';
$ret = preg_replace( $regEx, "<a href='$1'>$1</a>", $s);

其中:

(?:...)是非捕获组 \w代表[a-zA-Z0-9_]