Javascript RegEx匹配URL但排除图像

时间:2012-07-31 16:41:38

标签: javascript regex image hyperlink

我需要通过实际可点击链接替换HTML文本字符串中的所有文本链接。使用以下RegEx可以正常工作:

/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi

然后我注意到它还替换了图像和已经格式化的链接。数字我需要排除前面带有src的链接“和> ...我在这里回答的许多问题中搜索了一下并在负面预测中阅读了很多。我试过这个(在第一个之后添加了一些东西):

/(^(?!src="|>)\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gi

但这不再符合任何链接。我尝试了几个类似的声明,没有^,更改了一些括号等等,但似乎没有任何工作。我尝试将.{0}放在我添加的部分和\ b之间,以确保他只会查看网址前面的内容而不考虑更远的地方。

3 个答案:

答案 0 :(得分:3)

编辑:讨论时间越来越长,所以我决定更新答案。

相信您的原始正则表达式有效,我将通过其余答案参考简化版本:

/\b(https?|ftp|file)/gi

现在,你尝试了这个:

/^(?!src="|>)\b(https?|ftp|file)/gi
 ^

此处的主要错误标有插入符号:插入符号。这迫使你的正则表达式从行的开头匹配,这就是它没有匹配的原因。让我们删除它并继续前进:

/(?!src="|>)\b(https?|ftp|file)/gi

这次的主要错误在于你对先行断言的概念。正如我在评论中所解释的那样,这个断言是多余的,因为你说“匹配httphttpsftpfile,只要这些都不是src=">。“它几乎是多余的,句子对我们来说甚至都没有意义!相反,你想要的是 lookbehind 断言:

/(?<!src="|>)\b(https?|ftp|file)/gi
   ^

为什么呢?您希望在后面找到您可能希望匹配的字符串src="> 。问题? JavaScript不支持lookbehind断言。所以,我提出了一个替代方案。不可否认,这是有缺陷的(虽然不是因为你提出的HTML破坏的原因)。这是固定的:

/(.[^>"]|[^=]")\b(https?|ftp|file)/gi
  ^^^^^^^^^^^^

这确实是一种非直观的正则表达式,并且需要解释。它将我们的案件分成两部分。假设我们有两个字符集。如果 集合}或>,那么我们就不会怀疑它;我们很高兴;匹配可能跟随的任何URL。但是,如果 ">结尾,那么唯一的“可原谅”情况是第一个字符不是"。所以你看,这里有点逻辑伎俩。

现在,至于为什么这可能会破坏你的HTML。请务必使用JavaScript的=,并将第一个捕获的组替换回页面!如果你只是用虚无替换每个匹配,你最终会“吃掉”两个字符集,我们只想调查,而不是销毁。

replace

答案 1 :(得分:0)

我必须回家并且还没有测试过,但我觉得更容易处理你不想先分离HTML的简单任务。

  1. 做一场比赛,得到一些你不想处理的东西。
  2. 分拆出来。
  3. 迭代拆分数组并替换URL,然后将匹配的项目拼接回
  4. 加入并返回
  5. 唯一的假设是你没有在文本

    中以锚或img标签结束
    function zipperParse(htmlText,matcher){
        var zipBackInArray = htmlText.match(matcher),
        workingArray = htmlText.split(matcher),
        i = workingArray.length;
    
        while(i--){
            buildAnchorTagIfURLPresent(workingArray[i]); //You got this one covered
            workingArray.splice(i,0,zipBackInArray.pop());
            //working backwards makes splice much easier to use here
        }
        return workingArray.join('');    
    }
    
    var toExclude = /<a[^>]*>[^>]*>|<img[^>]*>/g;
    // is supposed to match all img and anchor pairs but not handling tags inside anchors yet
    
    zipperParse(yourHtmlText,toExclude);
    

答案 2 :(得分:0)

此代码对我有用...只需更改Google Api KEY即可排除。.=> XXXXXXXXXXXXXXXXXXXXXXXXX我只是将其放在了我的wordpress的functions.php主题中。首先要看的是,您的Google Maps代码如何显示在您的网站上,然后将其与替换后的代码进行匹配。

SQL_input = SQL_input & "SELECT DB2.TABLE1.CAT, DB2.TABLE1.BRD, DB2.TABLE1.ITEM, Sum(IIF(ITEM_ORD_Q-ITEM_RECV_Q < 0,0,ITEM_ORD_Q-ITEM_RECV_Q)) AS OO" & vbCrLf
SQL_input = SQL_input & "FROM DB2.TABLE2 INNER JOIN DB2.TABLE ON (DB2.TABLE2.ITEM = DB2.TABLE1.ITEM) AND (DB2.TABLE2.BRD = DB2.TABLE1.BRD) AND (DB2.TABLE2.CAT = DB2.TABLE1.CAT)" & vbCrLf
SQL_input = SQL_input & "WHERE (((DB2.TABLE2.ITEM_GRP_CAT)=" & cat & ") AND ((DB2.TABLE2.ITEM_GRP_code_C)='" & code & "'))" & vbCrLf
SQL_input = SQL_input & "GROUP BY DB2.TABLE1.CAT, DB2.TABLE1.BRD, DB2.TABLE1.ITEM;"

AdoRS1.Open (SQL_input)