我最近在为一个客户开发在线论坛程序,我想把用户发言中的url或e-mail地址用超链接显示出来. 用javascript的regular expressions是最容易实现的.
用户在表单里的多行文本框中输入他们的发言内容,然后把消息送到论坛的用户发言区中,然而,在把消息在论坛里显示出来之前,我要调用一个函数来处理消息,对url动些手脚.
我不想在这里讨论如何从数据库里取得一条记录了,这个站点已经说得很透彻了. 我们假设用户的消息文本存放在数据库中,并被赋予了一个叫s_message的变量.
<%
'...start the page and spit out html to the browser
'call the function to convert the message
response.write to_html(s_message)
%>
函数如下:
<%
function to_html(s_string)
to_html = replace(s_string, """", """)
to_html = replace(to_html, "<", "<")
to_html = replace(to_html, ">", ">")
to_html = replace(to_html, vbcrlf, "
")
to_html = replace(to_html, "/<", "<")
to_html = replace(to_html, "/>", ">")
to_html = edit_hrefs(to_html)
end function
%>
<script language="javascript1.2" runat=server>
function edit_hrefs(s_html){
// use regular expressions to look for
// e_mail addresses and urls
s_str = new string(s_html);
s_str = s_str.replace(/\bhttp\:\/\/www(\.[\w+\.\:\/\_]+)/gi,
"http\:\/\/?¤?$1");
s_str = s_str.replace(/\b(http\:\/\/\w+\.[\w+\.\:\/\_]+)/gi,
"<a href=\"$1\">$1<\/a>" target=_blank);
s_str = s_str.replace(/\b(www\.[\w+\.\:\/\_]+)/gi,
"<a href=\"http://$1\">$1</a>" target=_blank);
s_str = s_str.replace(/\bhttp\:\/\/?¤?(\.[\w+\.\:\/\_]+)/gi,
"<a href=\"http\:\/\/www$1\">http\:\/\/www$1</a>" target=_blank);
s_str = s_str.replace(/\b(\w+@[\w+\.?]*)/gi,
"<a href=\"mailto\:$1\">$1</a>" target=_blank);
return s_str;
}
</script>
上面的代码做了这些事儿:
1. 把引号转换成"这样的html元素. 这不是必需的,但最好这么做.
2. 把小于号转换成html元素<. 这样的话,如果有人在发的消息里用到了小于
号,html会正确输出. 另外,也防止某些人耍小花招,比如用<b>bold</b>来特定的字以粗体显示.
3. 把大于号转换成>. 原因同上.
4. 把回车换行转换成html换行标签"
"
5. 这就是我们要动的手脚. 它允许人们在代码里放入简单的html并逃脱代码的转换. 然而,他们得用"/"来避开对"<>"的代码检查. 我想总会有人找出绕过代码转换的办法的,如果他们办到了,用"牛"来形容他们的水平是再恰当不过的了.
6. 最后,调用javascript的edit_hrefs的函数.
现在,让我们来看看每行的javascript的函数做了些甚麽:
1. 为传递函数的参数创建一个字符串对象.
2. 把所有的http://www.[something]找出来,转换成http:////?¤?.
[something]. 这是一个临时性的措施,处理所有的www.[something]. 因此
http://www.pinarello.com/被替换成http://?¤?.pinarello.com/.
3. 转换其余的http://[something],有些网址是不以www开头的. 比如
http://uk.imdb.com/将被转换为<a
href="http://uk.imdb.com/">http://uk.imdb.com/</a>
4. 寻找所有的www.[something],把它们转换成html. 比如www.principia.dk将被转换成<a href="http://www.principia.dk">www.principia.dk</a>
5. 把第二部中所有的http://?¤?.[something]/给改回来. 第二步中的http://?
¤?.pinarello.com/将被转换为http://www.pinarello.com/.
6. 最后,找出e-mail地址将其转换为<a href="mailto:[e-mail address]">[e-
mail address]</a>. 我这里用来查找e-mail地址的regular expression不同于
ian stalling的, 但我还没有发现有甚麽e-mail地址用这种办法不能处理的. 然而,它还没有被彻底的测试过. 无论何时,只要你发现存在任何问题,最好马上就ian's的代码把我写的这些代码给换掉.
你可以把这个函数用于任何用途. 或许你能增强它的功能,或是删去多余的东西,抑或是增加新的函数. 如果你这么做了,你将乐在其中!
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器