我试图在包含链接的字符串之间进行替换,并将相同的字符串封装在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中试过这个,当我测试时,整个字符串都会突出显示...所以我真的很想知道我做错了什么。
答案 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;
答案 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_]