我现在有这个,(我在这里找到了代码)。
var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
someText.replace(exp, "<a href='$1'>$1</a>");
它将使用适当的<a href>
但我也要求它匹配www。没有http。我在RegEx Lib上找到了这个RegEx。
((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?
我在RegEx检查站点http://www.nvcc.edu/home/drodgers/ceu/resources/test_regexp.asp
上进行了测试它匹配我想要的字符串。但当我把它放入我的exp var时,JavaScript正在爆炸并导致错误。
我甚至尝试将其作为新的RegExp进行新的修改。
var exp = new RegExp(((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?);
但同样的事情发生了。
任何想法我做错了什么?
谢谢, 钢钣
答案 0 :(得分:6)
我相信RegExp构造函数将字符串作为参数,请参见此处:https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/RegExp
所以只需在正则表达式周围添加引号,它就可以正常工作。
var exp = new RegExp("((http\\://|https\\://|ftp\\://)|(www.))+(([a-zA-Z0-9\\.-]+\\.[a-zA-Z]{2,4})|([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\\?\\.'~]*)?");
someText.replace(exp, "<a href='$1'>$1</a>");
答案 1 :(得分:2)
好的,你已经理顺了JavaScript语法,现在让我们谈谈 regex 语法。冒号(:
)没有特殊含义,所以没有必要逃避它。点(.
)和问号(?
)通常具有特殊含义,但不会出现在字符类中(即方括号内)。
连字符(-
) 在字符类中具有特殊含义:它形成范围,如[a-z]
和[0-9]
。如果要在字符类中包含文字连字符,可以使用反斜杠对其进行转义,也可以将其放在列表的开头或结尾。例如,在[a-zA-Z0-9\.-]
中,最后的连字符与连字符匹配,而其他三个连字符用于形成范围。 (点前面的反斜杠是不必要的,但它不会伤害任何东西。)
现在看看[a-zA-Z0-9%:/-_\?\.'~]
。 ?
和.
前面的反斜杠只是杂乱无章,但是foruth连字符是一个真正的问题。它形成一个以/
开头并以_
结尾的范围;如果您查看ASCII字符映射,您会看到它包含数字0-9
和大写字母A-Z
,以及
/
,:
,;
,<
,=
,>
,?
,@
,[
,\
,]
,^
,_
......显然不是作者的意图。在该正则表达式中还有许多不必要的分组和重复代码,您是否真的需要匹配IP地址?道德是:不要相信你在RegExLib.com上找到的任何东西。
答案 2 :(得分:0)
javascript中的正则表达式必须用斜杠“/”包围,所以它看起来像
var expr = /pattern/flags;
对你而言,核心方式是
var exp = /((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?/;
如果使用构造函数new RegExp(),请以表单
调用它var expr = new RegExp(pattern [, flags]);
这里的模式和标志是字符串参数
var exp = new RegExp("((http\://|https\://|ftp\://)|(www.))+(([a-zA-Z0-9\.-]+\.[a-zA-Z]{2,4})|([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}))(/[a-zA-Z0-9%:/-_\?\.'~]*)?");