检测并删除textarea中的URL

时间:2013-02-23 19:31:19

标签: jquery regex

<textarea name="test">
  http://google.com/
  https://google.com/
  www.google.com/
  [url=http://google.com/]google.com[/url]
  text
</textarea>

我目前正在尝试检查textarea中是否有网址。

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 - 我想知道如何优化它。目前看起来非常草率和黑客攻击,希望有人可以提供一些见解。

我目前尝试从textarea中删除网址:

var value = $('textarea[name="test"]').val();
    value = value.replace(/\[\/?url([^\]]+)?\]/g, '');
$('textarea[name="test"]').val(value);

现在,它将输出:

<textarea>
  http://google.com/
  https://google.com/
  www.google.com/
  google.com
  text
</textarea>

我想要的输出是什么:

<textarea>
  text
</textarea>

3 个答案:

答案 0 :(得分:6)

尝试(评论后更正和改进):

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, '');

答案 1 :(得分:2)

关于您是否尝试检查textarea中是否有网址。

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添加到正则表达式的末尾会使^与每行的开头匹配,而不仅仅是字符串的开头。

.*中的/^http([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, '' );

如果网址可以显示在任何位置,您可以使用\b,意为字边界,而不是^,并删除m标记。

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

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

如果任何有效网址可以在textarea中的任何地方出现,并且被任何其他字符所包围,而不是没有防水解决方案。

答案 2 :(得分:1)

下面的JQuery代码将完成任务

<script>
// disable links in textarea and add class linkdisable in textarea
jQuery('.linkdisable').focusout(function(e){
  var message = jQuery('.linkdisable').val();
   if(/(http|https|ftp):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/i.test($(this).val())){
      alert('Links Not Allowed');
      e.preventDefault();
    }
   else if (/^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$/i.test($(this).val())) {
     alert('Links Not Allowed');
      e.preventDefault();
  }
});
</script>