检测并删除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]://[urlwww. ,应该删除,你可以使用

 value = value.replace( /^(?:https?:\/\/|\[url|www\.)\S+\s*/gm, '' ); 

如果url可以出现在任何地方,你可以使用\b ,意思是单词边界,而不是^ ,并删除m标志。

 value = value.replace( /(?:\bhttps?:\/\/|\bwww\.|\[url)\S+\s*/g, '' ); 

尝试提供更好的正则表达式解决方案是浪费精力,而没有关于文本区域中可能出现的URLforms的详细细节,它们可能出现在哪里以及哪些角色可能与它们相邻。

如果任何有效的url可以出现在textarea的任何地方 ,并被任何其他字符包围,那么就没有防水解决方案。