如何在字符串中将 http 替换为 https,但仅限于 PHP 中的特定域

问题描述 投票:0回答:1

我需要解析 html 内容的字符串,并在可能的情况下将其他域上的图像的 url 替换为 https,无论它们是 http。问题是并非所有外部域都支持 https,因此我不能将 http 全部替换为 https。

因此,我想使用我知道可以使用 https 的域列表来执行此操作。

还有一个额外的小问题,即搜索必须适用于与 www.www 无关的域。添加或不添加。

使用@Wiktor 给出的示例,我有一些接近我想要的东西,但这需要在找到匹配项时反转以运行替换,而不是在未找到匹配项时运行替换,因为此代码当前正在运行。

/http(?!:\/\/(?:[^\/]+\.)?(?:example\.com|main\.com)\b)/i
php regex replace preg-replace
1个回答
1
投票

相信你会用的

$domains = array("example.com", "main.com");
$s = "http://example.com http://main.main.com http://let.com";
$re = '/http(?=:\/\/(?:[^\/]+\.)?(?:' 
      . implode("|", array_map(function ($x) {
             return preg_quote($x); 
          }, $domains)) 
      . ')\b)/i'; 
echo preg_replace($re, "https", $s);
// => https://example.com https://main.main.com http://let.com

查看 IDEONE 演示

正则表达式匹配:

  • http
    -
    http
    仅当后面跟着...
  • (?=
    - 正向前瞻的开始
    • :\/\/
      -
      ://
      文字子字符串
    • (?:[^\/]+\.)?
      - 除
      /
      .
    • 之外的 1 个以上字符的可选序列
    • (?:
      +
      implode
      代码 - 创建一个转义各个文字分支的交替组(以匹配任何一个替代项,
      example
      main
      等)
    • )
      - 交替组结束
  • \b
    - 单词边界
  • )
    - 前瞻结束
  • /i
    - 不区分大小写修饰符。
© www.soinside.com 2019 - 2024. All rights reserved.