Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/412.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展现有正则表达式以在URL链接后删除标点_Javascript_Regex_Replace - Fatal编程技术网

Javascript 扩展现有正则表达式以在URL链接后删除标点

Javascript 扩展现有正则表达式以在URL链接后删除标点,javascript,regex,replace,Javascript,Regex,Replace,我有一个现有的替换,它在文本字符串中匹配http,并从文本创建一个工作URL 工作示例: var Text = "Visit Gmail at http://gmail.com" var linkText = Text.replace(/http:\/\/\S+/gi, '<a href="$&">$&</a>'); document.write(linkText); var Text=“访问Gmailhttp://gmail.com" var link

我有一个现有的替换,它在文本字符串中匹配http,并从文本创建一个工作URL

工作示例:

var Text = "Visit Gmail at http://gmail.com"
var linkText = Text.replace(/http:\/\/\S+/gi, '<a href="$&">$&</a>');
document.write(linkText);
var Text=“访问Gmailhttp://gmail.com"
var linkText=Text.replace(/http:\/\/\S+/gi,”);
文件。编写(链接文本);
输出:

var Text = "Visit Gmail at http://gmail.com"
var linkText = Text.replace(/http:\/\/\S+/gi, '<a href="$&">$&</a>');
document.write(linkText);
访问Gmail

问题:

var Text = "Visit Gmail at http://gmail.com"
var linkText = Text.replace(/http:\/\/\S+/gi, '<a href="$&">$&</a>');
document.write(linkText);
当链接出现在句子的末尾,标点符号错误地附加到URL的末尾时,就会出现问题

有人能建议如何扩展我的正则表达式(或者在它被转换后添加第二个替换项)来克服这个问题吗

我认为正确的答案将包括在我的原始正则表达式中添加一些类似于
/\W$/g
的内容,但我不知道如何将其应用于整个字符串中的一个单词

一如既往,非常感谢您的帮助

谢谢, 皮特

问题链接示例

  • ,
  • ?
  • !
所有这些都应该解析到


请注意,有些可能以斜杠结尾,然后是标点符号,而另一些可能以标点符号结尾,直接在域名后面。

为什么不使用负号类

/http://\S+[^.,?!]/gi

试试看

/http:\/\/(.(?![.?] |$))*/
我的逻辑是,如果最后一个字符是点或问号,后跟空格或字符串结尾,则不需要它

var Text = "Visit Gmail at http://gmail.com"
var linkText = Text.replace(/http:\/\/(.(?![.?](?:\s|$)))*./gi, '<a href="$&">$&</a>');
document.write(linkText);
您可以考虑尾随不需要的字符,无论是否剥离它们

两者的替代品是捕获缓冲区1:
$1

这也意味着你可以做回头看。虽然我不确定客户端JS是否可以执行查找断言

除去多余的炭

/(http:\/\/\S+)(?<![\/.,?!])[\/.,?!]*/
离开

/(http:\/\/\S+?(?=[\/.,?!]+(?:\s|$)|\s|$))/

我来测试一下,但你能帮我解释一下吗。这会删除标点符号、在标点符号之前终止搜索还是不匹配此格式的链接?谢谢。@PeterGross一定要验证它是否也适用于一系列不同的链接!很容易在一个小数据集上测试某些东西,并假设它适用于所有使用“.”的正则表达式,但仍然匹配空白,即:
http://not valid
。保持相同的形式,可以用\s或\s和
http:\/\/(?:\s(?![.?])+
http:\/\/(?:\s(?[\/,?!])+
Javascript不支持lookbehind。然而,我的回答使用了前瞻性
/(http:\/\/\S+?(?=[\/.,?!]+(?:\s|$)|\s|$))[\/.,?!]*/  
/(http:\/\/\S+?(?=[\/.,?!]+(?:\s|$)|\s|$))/