检测并删除textarea中的URL
我目前尝试检查textarea中是否有URL。
if ($('textarea[name="test"]').val().indexOf('[url') >= 0 || $('textarea[name="test"]').val().match(/^http([s]?):\/\/.*/) || $('textarea[name="test"]').val().match(/^www.[0-9a-zA-Z',-]./)) {
这似乎不能完全用于检查上面的任何URL – 我想知道如何优化它。 现在看起来非常邋and和黑客攻击,希望有人可以提供一些见解。
我目前尝试从textarea中删除URL:
var value = $('textarea[name="test"]').val(); value = value.replace(/\[\/?url([^\]]+)?\]/g, ''); $('textarea[name="test"]').val(value);
现在,它将输出:
我希望我的输出是:
尝试(评论后更正和改进):
value = value.replace(/^(\[url=)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?\S+$\s*/mg, '');
从头到尾剥离表达式:
- 除了方案之外,地址可能有两个或三个“部分”
- 地址可能以www开头
- 它由http://或https://开头
- 它可能被包含在[url = …] … [/ url]中
这个表达式没有强制执行完整正确的语法,这是一个更难写的正则表达式。
您可能需要的一些改进:
1.空间意识
value = value.replace(/^\s*(\[\s*url\s*=\s*)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?\S+\s*$\s*/mg, '');
2.最后一部分没有点
value = value.replace(/^(\[url=)?(https?:\/\/)?(www\.|\S+?\.)(\S+?\.)?[^.\s]+$\s*/mg, '');
关于您尝试检查textarea中是否有URL。
if ($('textarea[name="test"]').val().indexOf('[url') >= 0 || $('textarea[name="test"]').val().match(/^http([s]?):\/\/.*/) || $('textarea[name="test"]').val().match(/^www.[0-9a-zA-Z',-]./)) {
首先,不是使用多个函数调用三次获得textarea值,而是在检查之前将其存储在变量中,即
var value = $('textarea[name="test"]').val();
/^http([s]?):\/\/.*/
,因为^
只会在textarea值的开头找到“http:// …”时匹配。 这同样适用于^www.
。 将多行标志m
添加到正则表达式的末尾将使^
匹配每行的开头,而不仅仅是字符串的开头。
.*
in /^http([s]?):\/\/.*/
没有任何意义,因为它匹配零个或多个字符。 ([s]?)
比s?
更好s?
。
在/^www.[0-9a-zA-Z',-]./
需要转义以匹配文字.
如果这是你的意图,即\.
,我认为你的意思是匹配字符类中的多个字符,所以你需要用+
跟随它。
使用RegExp test
方法更有效,而不是在不需要实际match
时匹配,因此,结合上述内容,您可以拥有
if ( /^(\[url|https?:\/\/|www\.)/m.test( value ) ) {
如果您只是使用它来决定是否需要调用replace
,那么检查中没有什么意义,因为检查隐含在replace
调用本身中
使用简单的条件,即行开头的非空格字符串,以http[s]://
, [url
或www.
,应该删除,你可以使用
value = value.replace( /^(?:https?:\/\/|\[url|www\.)\S+\s*/gm, '' );
如果url可以出现在任何地方,你可以使用\b
,意思是单词边界,而不是^
,并删除m
标志。
value = value.replace( /(?:\bhttps?:\/\/|\bwww\.|\[url)\S+\s*/g, '' );
尝试提供更好的正则表达式解决方案是浪费精力,而没有关于文本区域中可能出现的URLforms的详细细节,它们可能出现在哪里以及哪些角色可能与它们相邻。
如果任何有效的url可以出现在textarea的任何地方 ,并被任何其他字符包围,那么就没有防水解决方案。