2011-01-22 69 views
7

我认为这与一些正则表达式有关,但它只是一种艺术 - 我需要一些帮助。Php用twitter账户链接取代@username

当我们显示一个故事时,我们将所有文本存储在一个可变参数中 - 比如说$故事。

我想什么是做str_replace函数(我认为这就是我需要的),说这样的事情“如果文本包含@something然后把它变成一个链接像<a href="http://www.twitter.com/something">@something</a> - 但只有这样做,如果没有什么之前的@符号“(以排除电子邮件地址)

另外,如果后面有空格或标点符号,我们需要停止”某事“。这样@something。不会变成<a href="http://www.twitter.com/something.">@something.</a>

关于如何使这项工作的任何建议?

回答

13
$input = preg_replace('/(^|\s)@([a-z0-9_]+)/i', 
         '$1<a href="http://www.twitter.com/$2">@$2</a>', 
         $input); 

See it

它匹配这是由空格或之前任何一个@(当它是开头)。

$input = preg_replace('/(?<=^|\s)@([a-z0-9_]+)/i', 
         '<a href="http://www.twitter.com/$1">@$1</a>', 
         $input); 

只匹配Twitter的名字,但只有在有空间或没有之前:

它也可以用积极的回顾后的短路。

6

正回顾后可以做的伎俩:

preg_replace('/(?<=\s)@(.*?)/', '<a href="....com/$1">@$1</a>') 

去了我的头顶。 “如果有一个@之前是空白的东西,那么在@之后采取任何后续操作,然后执行html标记包装”。

+1

那么,你需要`[a-z0-9 _-]`而不是正则表达式中的`.`,对吧?由于twitter的名字不能有特殊的字符或空格(你的正则表达式现在可以选择,实际上,它会一直吃到字符串的末尾)... – ircmaxell 2011-01-22 04:42:28

+0

当在twitter上有一个twitter名字时失败开始时没有空间。 – codaddict 2011-01-22 04:45:15

相关问题