RegEx:将Twitter中的Twitter名称提及链接到Twitter

时间:2009-11-16 10:01:34

标签: html regex twitter

我想做THIS,稍微复杂一些:

让我们说,我有一个HTML输入:

<a href="http://www.example.com" title="Bla @test blubb">Don't break!</a>
Some Twitter Users: @codinghorror, @spolsky, @jarrod_dixon and @blam4c.
You can't reach me at blam4c@example.com.

是否有一个好的RegEx来替换Twitter用户提及的Twitter用户名,但留下@example(底部的电子邮件地址)和@test(链接标题,即HTML标签)?

它可能也应该尝试不在现有链接中添加链接,即不要破坏它:

<a href="http://www.example.com">Hello @someone there!</a>

我目前的尝试是添加“&gt;”在字符串的开头,然后使用此RegEx:

Search:  '/>([^<]*\s)\@([a-z0-9_]+)([\s,.!?])/i'
Replace: '>\1<a href="http://twitter.com/\2">@\2</a>\3'

然后删除“&gt;”我在第1步中添加了。

但是除了“@ blam4c”之外,什么都不匹配。我知道为什么会这样做,这不是问题。

我想找到一个解决方案,找到并替换所有Twitter用户名提及而不破坏HTML。也许在没有RegEx的情况下编写代码可能更好?

3 个答案:

答案 0 :(得分:3)

首先,将尖括号放在正则表达式之外。

使用HTML解析器和xpath选择您有兴趣处理的文本节点,然后考虑使用regexp仅匹配这些节点中的@refs。

我会让其他人尝试给正则表达式部分一个特定的答案。

答案 1 :(得分:2)

我同意ddaa,如果没有首先剥离html链接,几乎没有理智的方法来攻击它。

据推测,您将开始使用实际的Twitter消息, definition 不能包含任何手动输入的超链接。

例如,这是我发现这个问题的方法(该链接解决了这个问题,所以不要费心点击它!)

  

一些推特用户:@codinghorror,@ spsosky,@ jarrod_dixon和@ blam4c。 http://bit.ly/2phvZ1

在这种情况下,很容易:

var msg = "Some Twitter Users: @codinghorror, @spolsky, @jarrod_dixon and @blam4c. http://bit.ly/2phvZ1";

var html = Regex.Replace(msg, "(?<!\w)(@(\w+))", 
    "<a href=\"http://twitter.com/$2\">$1</a>");

(这可能需要一些调整,我想针对语料库进行测试,但对于普通的Twitter消息来说似乎是正确的)

至于你更复杂的案例(推特中嵌入了HTML标记),我不知道。对我来说太难了。

答案 2 :(得分:1)

此正则表达式可能会更好一些:/\B\@([\w\-]+)/gim

这是一个jsFiddle实例:http://jsfiddle.net/2TQsx/4/