Javascript 扩展现有正则表达式以在URL链接后删除标点
我有一个现有的替换,它在文本字符串中匹配http,并从文本创建一个工作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
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|$))/