2009-02-09 135 views
-1

我使用正则表达式检测Twitter流中的@replies,使用正则表达式使用以下PHP代码。我怎么能结合这些正则表达式规则?

$text = preg_replace('!^@([A-Za-z0-9_]+)!', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text); 
$text = preg_replace('! @([A-Za-z0-9_]+)!', ' <a href="http://twitter.com/$1" target="_blank">@$1</a>', $text); 

我怎样才能最好地结合这两个规则,而不会错误地标记[email protected]作为答复?

+0

看看http://stackoverflow.com/questions/525635/regular-expression-match-start-or-whitespace – hop 2009-02-09 21:19:27

+0

某人的相当自由与downvotes ... – 2009-02-09 21:41:40

+0

我downvoted所有错误的答案,但不是这个问题... – hop 2009-02-10 10:24:13

回答

4

OK,再一想,不下垂无论@电子邮件意味着先前的元素必须是一个“无字”的项目,因为任何其他可能被包含在一个字元素可以被通知,电子邮件,所以这会导致:

!(^|\W)@([A-Za-z0-9_]+)! 

但你必须使用$ 2而不是$ 1。

+0

这很好,谢谢! – ceejayoz 2009-02-09 21:37:33

+0

[A-ZA-Z0-9 _] == \ W – Mez 2009-02-09 21:37:48

0

这是我怎么会做组合

$text = preg_replace('!(^|)@([A-Za-z0-9_]+)!', '$1<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text); 
+0

请阅读帖子。 “我怎样才能最好地结合这两个规则,而不会错误地标记[email protected]作为答复?” – ceejayoz 2009-02-09 21:19:36

+0

男人,我很抱歉 - 我完全错过了那篇文章的一部分 - 我不是故意浪费回复。 – 2009-02-09 21:32:16

-2

我认为你可以使用轮换,:所以找了一个字符串的开头或空格

'!(?:^|\s)@([A-Za-z0-9_]+)!' 
-1
preg_replace('%(?<!\S)@([A-Za-z0-9_]+)%', '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text); 

(?<!\S)是松散翻译成“没有前面的非空白字符”。双重否定的排序,但也适用于字符串/行的开始。

这不会消耗任何前面的字符,不会使用任何捕获组,并且不会匹配字符串,如"[email protected]",这是一个有效的电子邮件地址。

测试:

Input = 'foo bar [email protected] bee @def [email protected] @woo' 
Output = 'foo bar [email protected] bee <a href="http://twitter.com/def" target="_blank">@def</a> [email protected] <a href="http://twitter.com/woo" target="_blank">@woo</a>' 
-2

胡,伙计们,不要推得太远......这就是:

!^\s*@([A-Za-z0-9_]+)! 
-1
$text = preg_replace('/(^|\W)@(\w+)/', '<a href="http://twitter.com/$2" target="_blank">@$2</a>', $text); 
2

由于^不必站在RE的开始,您可以使用分组和|来组合这些RE。

如果你不想重新插入你拍摄的空格,您必须使用 “正回顾后”:

$text = preg_replace('/(?<=^|\s)@(\w+)/', 
    '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text); 

或 “负回顾后”:

$text = preg_replace('/(?<!\S)@(\w+)/', 
    '<a href="http://twitter.com/$1" target="_blank">@$1</a>', $text); 

...无论你发现哪一个更容易理解。