9
<textarea name="test">
  http://google.com/
  https://google.com/
  www.google.com/
  [url=http://google.com/]google.com[/url]
  text
</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 - 我想知道如何优化它。目前它似乎非常草率和黑客攻击,希望有人可以提供一些见解。

我目前从 textarea 中删除 URL 的尝试:

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>
4

3 回答 3

6

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

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

从头到尾剥离表达式:

  • 除了方案之外,地址可能有两个或三个“部分”
  • 地址可能以www开头,也可能不以 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, '');
于 2013-02-23T19:47:57.553 回答
2

关于您尝试检查文本区域中是否存在 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?

/^www.[0-9a-zA-Z',-]./中,如果这是您的意图,则.需要转义以匹配文字.,即\.,我假设您的意思是匹配字符类中的多个字符,因此您需要使用+.

使用 RegExptest方法比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, '' );

试图提供更好的正则表达式解决方案而没有精确的细节来说明文本区域中可能出现的 url 形式、它们可能出现的位置以及可能与它们相邻的字符,这将是一种浪费。

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

于 2013-02-23T19:49:55.837 回答
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>
于 2020-03-19T12:01:37.177 回答