Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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 - Fatal编程技术网

Javascript URL替换为锚点,而不是替换现有锚点

Javascript URL替换为锚点,而不是替换现有锚点,javascript,regex,Javascript,Regex,我正在构建代码匹配和替换几种类型的模式(bbCode)。我尝试进行的匹配之一是[url=http:example.com]将所有内容替换为锚链接。我还尝试用锚链接匹配和替换普通文本URL。而这两者的结合正是我遇到麻烦的地方 由于我的例程是递归的,每次运行时都会匹配和替换整个文本,所以我在不替换锚中已经包含的URL时遇到了问题 这是我正在运行的递归例程: if(text.search(p.pattern) !== -1) { text = text.replace(p.pattern, p

我正在构建代码匹配和替换几种类型的模式(bbCode)。我尝试进行的匹配之一是[url=http:example.com]将所有内容替换为锚链接。我还尝试用锚链接匹配和替换普通文本URL。而这两者的结合正是我遇到麻烦的地方

由于我的例程是递归的,每次运行时都会匹配和替换整个文本,所以我在不替换锚中已经包含的URL时遇到了问题

这是我正在运行的递归例程:

if(text.search(p.pattern) !== -1) {
    text = text.replace(p.pattern, p.replace);
}
这是迄今为止我对普通URL的regexp:

/(?!href="|>)(ht|f)tps?:\/\/.*?(?=\s|$)/ig
URL可以以http、https、ftp或ftps开头,然后包含任何文本,以空格或标点符号(./!/?/)结尾

为了明确起见,我将此用作匹配测试:

应匹配:

  • www.example.com/test
不应该匹配

我真的很感激能在这里得到的任何帮助

编辑 下面jkshah接受的第一个解决方案确实存在一些缺陷。例如,它将匹配

<img src="http://www.example.com/test.jpg">


然而,Jerry解决方案中的评论确实让我想再试一次,而且该解决方案也解决了这个问题。因此,我接受了这一解决办法。谢谢大家在这方面的帮助。:)

也许是这样的

/(?:(?:ht|f)tps?:\/\/|www)[^<>\]]+?(?![^<>\]]*([>]|<\/))(?=[\s!,?\]]|$)/gm

/(?:(?:ht | f)tps?:\/\/(www)[^\]+?(?![^\]*([>]|].下面的正则表达式应该可以工作。它可以为您的示例输入提供所需的结果

/((?:(?:ht|f)tps?:\/\/|www)[^\s,?!]+(?!.*<\/a>))/gm

p.replace
是否可以作为一项功能?如果可以:

var text = 'http://www.example.com \n' +
           'http://www.example.com/test \n' +
           'http://example.com/test \n' +
           'www.example.com/test \n' +
           '<a href="http://www.example.com">http://www.example.com </a>\n' +
           '<a href="http://www.example.com/test">http://www.example.com/test </a>\n' +
           '<a href="http://example.com/test">http://example.com/test </a>\n' +
           '<a href="www.example.com/test">www.example.com/test </a>';
var p = {
    flag: true,
    pattern: /(<a[^<]*<\/a>)|((ht|f)tps?:\/\/|www\.).*?(?=\s|$)/ig,
    replace: function ($0, $1) {
                 if ($1) {
                     return $0;
                 } else {
                     p.flag = true;
                     return "construct replacement string here";
                 }
    }
};
while(p.flag){
    p.flag = false;
    text = text.replace(p.pattern, p.replace);
}
var text='1〕http://www.example.com \不+
'http://www.example.com/test \不+
'http://example.com/test \不+
“www.example.com/test\n”+
“\n”+
“\n”+
“\n”+
'';
var p={
旗帜:是的,

模式:/(很抱歉,这与我正在运行的任何测试都不匹配。我正在使用text.replace(p.pattern,p.replace)通过javascript运行匹配;我已经重新定义了上面的问题,以包括我的匹配测试,以及我正在运行的查找匹配项的例程。@ØysteinAmundsen如果你逐行测试,应该不会有任何问题,但我想我可以添加一个完整页面的版本或其他内容……更新的正则表达式。@ØysteinAmundsen你打算如何识别你的数据库中的第四个链接问题?它会从
www
?@ysteinAmundsen开始吗?你在转义正则表达式中使用的特殊字符吗?这些字符太多了。试试这个-/(?:ht | f)tps?:\/\/\/[^\x3C\]+?(?![^\x3E\]*[\x3E])(?=[\\s!,?\]\124$)/G这在替换上不起作用:它匹配得很好…对于替换,您需要用括号捕获整个正则表达式。检查Brilliant!非常感谢。:-)在这个正则表达式中遇到了一些问题。它实际上也匹配,结果是">我真的希望它不是一个函数,因为我知道可以过滤掉锚点中已经包含的所有匹配项…并且您提供的regexp匹配每个url,甚至是链接中已经包含的url。但我想这是个想法,因为您在p.replace函数中对匹配项进行了微调。现在这是一个非常普遍的问题m、 当你应用于更广泛的样本时,你会发现一个或另一个正则表达式有更多的错误。你必须相应地调整正则表达式。
var text = 'http://www.example.com \n' +
           'http://www.example.com/test \n' +
           'http://example.com/test \n' +
           'www.example.com/test \n' +
           '<a href="http://www.example.com">http://www.example.com </a>\n' +
           '<a href="http://www.example.com/test">http://www.example.com/test </a>\n' +
           '<a href="http://example.com/test">http://example.com/test </a>\n' +
           '<a href="www.example.com/test">www.example.com/test </a>';
var p = {
    flag: true,
    pattern: /(<a[^<]*<\/a>)|((ht|f)tps?:\/\/|www\.).*?(?=\s|$)/ig,
    replace: function ($0, $1) {
                 if ($1) {
                     return $0;
                 } else {
                     p.flag = true;
                     return "construct replacement string here";
                 }
    }
};
while(p.flag){
    p.flag = false;
    text = text.replace(p.pattern, p.replace);
}