使用锚标记围绕@________,#___________和http:// _________的所有实例?

时间:2009-08-01 06:53:11

标签: javascript regex

相关(但略有不同):

  

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代码并替换函数。

非常感谢!这个问题困扰了我一段时间

5 个答案:

答案 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开放。