我需要通过实际可点击链接替换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之间,以确保他只会查看网址前面的内容而不考虑更远的地方。
答案 0 :(得分:3)
编辑:讨论时间越来越长,所以我决定更新答案。
相信您的原始正则表达式有效,我将通过其余答案参考简化版本:
/\b(https?|ftp|file)/gi
现在,你尝试了这个:
/^(?!src="|>)\b(https?|ftp|file)/gi
^
此处的主要错误标有插入符号:插入符号。这迫使你的正则表达式从行的开头匹配,这就是它没有匹配的原因。让我们删除它并继续前进:
/(?!src="|>)\b(https?|ftp|file)/gi
这次的主要错误在于你对先行断言的概念。正如我在评论中所解释的那样,这个断言是多余的,因为你说“匹配http
或https
或ftp
或file
,只要这些都不是src="
或>
。“它几乎是多余的,句子对我们来说甚至都没有意义!相反,你想要的是 lookbehind 断言:
/(?<!src="|>)\b(https?|ftp|file)/gi
^
为什么呢?您希望在后面找到您可能希望匹配的字符串src="
或>
。问题? JavaScript不支持lookbehind断言。所以,我提出了一个替代方案。不可否认,这是有缺陷的(虽然不是因为你提出的HTML破坏的原因)。这是固定的:
/(.[^>"]|[^=]")\b(https?|ftp|file)/gi
^^^^^^^^^^^^
这确实是一种非直观的正则表达式,并且需要解释。它将我们的案件分成两部分。假设我们有两个字符集。如果 集合1>}或>
,那么我们就不会怀疑它;我们很高兴;匹配可能跟随的任何URL。但是,如果 以"
或>
结尾,那么唯一的“可原谅”情况是第一个字符不是"
。所以你看,这里有点逻辑伎俩。
现在,至于为什么这可能会破坏你的HTML。请务必使用JavaScript的=
,并将第一个捕获的组替换回页面!如果你只是用虚无替换每个匹配,你最终会“吃掉”两个字符集,我们只想调查,而不是销毁。
replace
答案 1 :(得分:0)
我必须回家并且还没有测试过,但我觉得更容易处理你不想先分离HTML的简单任务。
唯一的假设是你没有在文本
中以锚或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)