【问题标题】:Javascript Regex to covert all links on the website from http to httpsJavascript Regex 将网站上的所有链接从 http 转换为 https
【发布时间】:2019-06-27 15:44:15
【问题描述】:

我想将网站上的所有链接更改为 https 以避免任何混合内容,因为我的开发人员总是忘记更改链接。

我假设有一种方法使用 Javascript Regex 我可以找到 HTTP 并将其替换为 https

我尝试过这样的代码,但失败了。

我相信这些方法会奏效

我想使用网站页脚中的代码,这样所有页面都可以使用。

【问题讨论】:

  • 你在说什么链接?存储在数组中,图像的 .src 属性,href?
  • 好问题。 href 和图像中的所有链接以及 src

标签: javascript regex url https


【解决方案1】:

您并没有真正展示您尝试过的任何代码,但这非常简单,并且可以通过巧妙地使用查询选择器和一些数组技术来做得更好:

[...document.querySelectorAll('*[src], *[href]')].forEach(element => {
  ['src', 'href'].forEach(attribute => {
    if (element[attribute]) {
      element[attribute] = element[attribute].replace(/^http:\/\//ig, 'https://');
    }
  });
});

【讨论】:

  • 我喜欢您编写代码的方式,但它使我的链接转到 HTTP 并且不会更改为 https。
  • 你确定吗?你是在 DOM 完成加载后运行它吗?我刚刚对其进行了测试,它似乎对我有用。
  • 是的,它不起作用,我不知道为什么。在测试之前,我确实让 DOM 完全加载。我认为这个网站有一个奇怪的 WP 代码,尽管控制台中没有错误,但它会以某种方式发生冲突。
  • 如果你把console.log(attribute, element[attribute])放在最里面的if块中,紧跟在它设置element[attribute] = ...的位置之后,控制台会显示什么?
  • 没有 URL 属性之类的东西。我假设您的背景图像是由 background-image CSS 属性设置的?因为它是在 CSS 中的,并且被包裹在 url() 中,所以它更加复杂。您必须选择可能具有背景图像的每个元素(因此,可能所有带有 * 选择器的元素),在其上运行 window.getComputedStyle(),然后在 background-image 属性上使用正则表达式来解析 URL,然后基于它在元素的直接样式中设置一个新的背景图像。这并不容易。
【解决方案2】:

我的猜测是这个表达式或者可能是它的修改版本,

(http)(:[^\s]+)

替换为,

$1s$2

可能是您正在寻找的东西。

在这个demo 中,解释了表达式,如果您可能感兴趣的话。

测试

const regex = /(http)(:[^\s]+)/gm;
const str = `http://some_domain.com/some_link/`;
const subst = `$1s$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log(result);

【讨论】:

  • 此代码没有找到我现有的要更改的链接。
【解决方案3】:

如果你使用 jQuery,你可以这样做:

$(function() {
 $("a").each(function() {
      if ($(this).attr("href").includes("http:"))
           $(this).attr("href",$(this).attr("href").replace("http:","https:"));
 });
 $("img").each(function() {
      if ($(this).attr("src").includes("http:"))
           $(this).attr("src",$(this).attr("src").replace("http:","https:"));
 });
});

但是,我认为这不是一个好主意。如果您将此脚本放在页脚中,HTML 处理器将通过您拥有的任何协议、HTTP 等加载所有资产。然后,您的脚本将运行并可能更改 URL。然后 HTML 处理器将再次下载这些资产以进行处理。如果其中一些资产或脚本或 CSS,则必须重新渲染页面,可能会在保存时多次渲染。可能会出现性能下降、重复的资产加载以及可能发生的页面闪烁。

如果这些是您的服务器或 CDN 上的本地资产,更好的解决方案是尽可能使用与协议无关的 URL。例如:

<a href="//ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js">

or <img src="//myserver.com/image1.jpg">

浏览器将根据用于获取网页的协议填写 http 或 https。如果您可以让您的开发人员一直使用这种方法,那么他们就不必更改协议。

【讨论】:

  • 代码失败,但我喜欢你不可知的 URL 想法 :)
  • 代码需要jQuery库;我确实在 Code Pen 中尝试过。它正在处理我的 HTML。 codepen.io/anon/pen/eweKJQ
【解决方案4】:

您可以使用 document.getElementsByTagName() 获取特定类型的所有元素的 HTML 集合

假设您要更改所有 &lt;img&gt;elements 的 .src 属性。

var elements=document.getElementsByTagName("img");

现在,如果您循环遍历元素,您可以使用 String 对象的 replace() 方法修改它的 .src 属性。

elements[0].src=elements[0].src.replace("http","https");

这是一个使用 img 和 a 来说明该过程的示例:

function replace(htmlElements) {
  for (var a = 0; a < htmlElements.length; a++) {
    var localElement = htmlElements[a];
    var property;
    switch (localElement.localName) {
      case "img":
        property = "src";
        break;
      case "a":
        property = "href";
        break;
    }
    if (localElement[property].indexOf("https") == -1) {
      localElement[property] = localElement[property].replace("http", "https");
    }
  }
}
var elements = document.getElementsByTagName("img");
replace(elements);
elements = document.getElementsByTagName("a");
replace(elements);
<a href="http://www.example.com/linkA">LinkA</a>
<a href="https://www.example.com/linkB">LinkB</a>
<a href="http://www.example.com/linkC">LinkC</a>
<img src="http://picsum.photos/id/469/200/300">
<img src="http://picsum.photos/id/269/200/300">

【讨论】:

  • 这段代码使我的一些链接由于某种原因变成了 httpss。
  • @Justin - 是的,如果它已经是 https,就会发生这种情况。我修复了上面的代码来解决这个问题!
猜你喜欢
  • 2019-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多