我想做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的情况下编写代码可能更好?
答案 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/