2009-02-09 134 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); 

...無論你發現哪一個更容易理解。