Javascript Regex: surround @_____, #_____, and http://______ with anchor tags in one pass?
我想用锚标记包围所有@_______,#_________和http://________
的实例。我可以多次通过。
例如,请考虑此Twitter消息:
The quick brown fox @Spreadthemovie jumps over the lazy dog #cow, http://bit.ly/bC9Dy
使用所需的正则表达式模式运行它将产生:
The quick brown fox <a href="blah/Spreadthemovie">@Spreadthemovie</a> jumps over the lazy
dog <a href="blah/cow">#cow</a>, <a href="blah/http://bit.ly/bC9Dy">http://bit.ly/bC9Dy</a>
仅包含以@,#或http://开头的单词,以便dog@gmail.com不会成为dog@gmail.com。另外,请注意“#cow,
”如何变成“<a href=urlB>#cow</a>,
”...我只希望字母数字字符位于每个锚标记子字符串的末尾。另请注意href属性。
如果可能,请包含带有正则表达式模式的实际javascript代码并替换函数。
非常感谢!这个问题困扰了我一段时间
答案 0 :(得分:1)
在我的代码中我有类似的功能,你可以看看并改变它以满足你的需求:
function checkChatUrl($matches) { if(strpos($matches[0],'http://www.xxx.pl/?task=forum')!==false) $n='>forum'; elseif(strpos($matches[0],'http://www.xxx.pl')!==false) $n='>xxx'; elseif(strpos($matches[0],'db.php')!==false) return ""; elseif(strpos($matches[0],'%22')!==false) return ""; else $n=">".substr($matches[1].$matches[2],0,10).((strlen($matches[1].$matches[2])>10)?'..':''); return "<a href='http://$matches[1]$matches[2]' target=_blank $n</a>"; } $text=preg_replace_callback("/\bhttp:\/\/([\w\.]+)([\#\,\/\~\?\&\=\;\-\w+\.\/]+)\b/i",'checkChatUrl',$text);
这是专为聊天的网址链接而设计的,它的名称更短,而且某些网址使用准备好的快捷方式。
答案 1 :(得分:1)
str.replace(
/(\s|^)([#@])([\w\d]+)|(http:\/\/\S+)/g,
'$1<a href="$3$4">$2$3$4</a>'
);
答案 2 :(得分:0)
为了匹配@和#标签,我建议使用\ w metapattern(匹配单词字符 - 所以它将匹配数字和字母,但不匹配空格/标点符号)。因此,您需要类似以下模式的内容来提取匹配的项目:
(@\w+)
(#\w+)
对于匹配的URL,一个简单但天真的模式只是匹配http://后跟任何非空格:
(http://\S+)
但是,某些字符在URL中无效,会被此捕获。更复杂的模式只允许在URL中有效的字符如下:
(http://[a-zA-Z0-9+$_.+!*'(),#/-]+)
答案 3 :(得分:0)
以下是基于修订问题的修订答案。您应该将修订/评论放在原始问题上。
它为3个动作使用3个模式并将它们链接起来。它使用单词边界模式(\ b \ B)代替(^ | \ s)。这会选择由标点符号分隔的模式,没有空格,例如@ tweet,#tag
<script type=text/javascript>
function addTags(str) {
return str.replace(/\B(@)(\w+)/g, '<a href"//twitter.com=/$2">$1$2</a>')
.replace(/\B(#)(\w+)/g, '<a href="web#q=$2">$1$2</a>')
.replace(/\b(http:\S+[^,.])/g, '<a href="$1">$1</a>')
;
}
function testTags() {
document.getElementById('outstr').innerHTML =
document.getElementById('outtxt').innerHTML =
addTags(document.getElementById('instr').value);
}
</script>
<input type=text size=100 id="instr" value="@begin ignore@email.com and then #cow to http://mysite.com and also http://yoursite.com."><br>
<p><textarea id="outtxt" cols=90></textarea>
<p id=outstr></p>
<p><button onclick="testTags();">TEST</button>
我用以上测试过。
答案 4 :(得分:0)
确保您了解possible risks in doing naive replacement on links。
不允许用户在您的网站上插入任意HTML。 XSS游戏的名称是清理用户输入。如果您坚持使用基于白名单的方法 - 只允许您知道的输入是好的,并立即丢弃其他任何东西 - 那么您通常可以很好地解决您可能遇到的任何XSS问题。
Naïve替换计为允许在您的网站上插入任意HTML。
至少,请尝试确保生成的<a href=''>
不会以javascipt:
开头,因为您向Cross-Site Request Forgeries开放。