Javascript RegEx匹配URL's,但不包括图像
Javascript RegEx to match URL's but exclude images
我需要用实际的可点击链接替换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之间,以确保他只看url前面的东西,而不考虑更远的东西。
编辑:讨论时间越来越长,所以我决定更新答案。
相信您的原始regex是有效的,我只想在这个答案的其余部分参考一个简化版本:
/'b(https?|ftp|file)/gi
现在,你尝试了这个:
/^(?!src="|>)'b(https?|ftp|file)/gi
^
此处的主要错误由插入符号标记:插入符号。这迫使正则表达式从行的开头开始匹配,这就是为什么它什么都不匹配的原因。让我们去掉它,继续前进:
/(?!src="|>)'b(https?|ftp|file)/gi
这一次的主要错误在于你对前瞻性断言的概念。正如我在评论中所解释的,这个断言是多余的,因为你在说,"匹配http
、https
、ftp
或file
,只要它们都不是src="
或>
。"它几乎是多余的以至于这个句子对我们来说都没有意义!相反,您想要的是lookbacking断言:
/(?<!src="|>)'b(https?|ftp|file)/gi
^
为什么?因为您希望在您可能希望匹配的字符串后面找到src="
或>
。问题是什么?JavaScript不支持后备断言。所以,我提出了一个替代方案。诚然,它是有缺陷的(尽管并不是您提到的HTML崩溃的原因)。它在这里,已修复:
/(.[^>"]|[^=]")'b(https?|ftp|file)/gi
^^^^^^^^^^^^
这确实是一个非直观的正则表达式,值得解释。它把我们的案子一分为二。假设我们有一个两个字符集。如果集合不结束于>
或"
,那么我们对此并不怀疑;我们可以出发了;匹配可能出现的任何URL。然而,如果确实以>
或"
结尾,那么,唯一"可原谅"的情况是第一个字符不是=
。你看,这里有点逻辑把戏。
现在,看看为什么这会破坏你的HTML。请确保使用JavaScript的replace
,并将第一个捕获的组替换回页面!如果你只是用虚无来代替每一个匹配,你最终会"吃掉"两个角色集,我们只是想调查,而不是破坏。
html.replace(/(.[^>"]|[^=]")'b(https?|ftp|file)/gi,
function(match, $1, offset, original) {
return $1;
});
我必须回家,还没有测试,但我会觉得更轻松地处理隔离你不想首先输出的HTML的任务。
- 做一场比赛,得到一系列你们不想处理的东西
- 用劈叉把它全部撕开
- 迭代拆分数组并替换URL,然后将匹配的项目拼接回
- 加入并返回
唯一的假设是,您不会在文本中以锚或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);
这段代码对我有效…只需将Google Api KEY更改为排除..=>XXXXXXXXXXXXXXXXXXXXXX我刚刚把它放在我的wordpress的functions.php主题中。第一件事是看看你的谷歌地图代码是如何出现在你的网站上的,然后将其与被替换的内容进行匹配。
function remove_script_version( $src ) {
$parts1 = explode( '?', $src );
$parts2 = str_replace('//maps.googleapis.com/maps/api/js', '//maps.googleapis.com/maps/api/js?language=es&v=3.31&libraries=places&key=XXXXXXXXXXXXXXXXXXXXXX&ver=3.31', $parts1);
return $parts2[0]; }
add_filter( 'script_loader_src', 'remove_script_version', 15, 1 );
add_filter( 'style_loader_src', 'remove_script_version', 15, 1 );
- 如何将页面上的所有电话号码更改为可点击链接,不包括特定类别的元素
- CodeIgniter:用于获取包括图像在内的值的控制器
- 使用send时,jquery文件上传不调整图像客户端的大小
- 为什么innerHTML不更改图像的src
- 将正则表达式重新分解为不包括空组
- 为什么从JSON文本到类型的转换不包括函数
- XMLHttpRequest调用不包括If Modified Since标头
- 预加载标签IMG而不指定图像的名称
- 使用 JavaScript 执行一行 PHP(不包括 PHP 文件)
- 导出带有标题的Excel,包括图像
- JavaScript 在删除预上传图像时不清除图像数组
- 捆绑器不包括 .min 文件
- 锤击JS平移不移动图像
- 与冒号(不包括冒号)之间的正则表达式单词匹配
- 包含特殊字符 (!,@,#,&) 不包括其他特殊字符
- Javascript RegEx:如何获取单引号之间的名称(不包括单引号)
- 添加此共享按钮不显示图像
- Javascript RegEx匹配URL's,但不包括图像
- Rails不包括用于javascript的require_tree
- Jquery /javascript代码,用于获取网页主页面的全文内容(包括链接文本但不包括图像)