从 img src 中删除 http:

Remove http: from img src

使用 php 是否可以从 img src 中删除 http: 协议?

因此 img src 将是:

<img src="//www.example.com/image.jpg" />

而不是

<img src="http://www.example.com/image.jpg" />

str_replace 是个不错的选择吗?我知道我可以定义:

$contentImg = str_replace(array('http', 'https'), '', $filter);

我只是不确定如何定义 $filter。

假设 $filter 工作正常并且源被正确获取,您还可以使用正则表达式替换:

$contentImg = preg_replace('/^https?:/','', $string);

'/^https?:/' 是一个正则表达式: - ^ 字符表示字符串的开头,因此您只删除前面的潜在协议。 - ? 是一个特殊字符,指定 s 是可选的。因此它将匹配 http:https:.

使用正则表达式,您可以编写一些更紧凑的查询。假设(为了回答)您还希望删除 ftpsftp,您可以使用:

'/^(https?|s?ftp):/'

因为 | 表示 并且括号用于分组目的。

您还忘记删除冒号 (:)。

不过,我更担心您的 $filter 会包含 整个页面源代码 。在这种情况下,它弊大于利,因为包含 http: 的文本也可能被删除。为了解析和处理 XML/HTML,最好使用 DOMParser。这将引入一些开销,但正如一些软件工程师所说:"Software engineering is engineering systems against fools, the universe currently produces more and more fools, the small bit of additional overhead is thus justifiable".

示例:

你绝对应该像之前所说的那样使用 DOMParser(因为这种方法更安全):

$dom = new DOMDocument;
$dom->loadHTML($html); //$html is the input of the document
foreach ($dom->getElementsByTagName('img') as $image) {
    $image->setAttribute('src',preg_replace('/^https?:/','',$image->getAttribute('src')));
}
$html = $dom->saveHTML(); //html no stores the new version

(运行 php -a 中的这个为您的测试示例提供了预期的输出)。

或在 post 处理步骤中:

$html = get_the_content();
$dom = new DOMDocument;
$dom->loadHTML($html); //$html is the input of the document
foreach ($dom->getElementsByTagName('img') as $image) {
    $image->setAttribute('src',preg_replace('/^https?:/','',$image->getAttribute('src')));
}
$html = $dom->saveHTML();
echo $html;

性能:

使用 php -a 交互式 shell(1'000'000 个实例)对性能进行了测试:

$ php -a
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { str_replace(array('http:', 'https:'), '', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
5.4192590713501
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { preg_replace('/^https?:/','', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
5.986407995224
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { preg_replace('/https?:/','', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
5.8694758415222
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { preg_replace('/(https?|s?ftp):/','', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
6.0902049541473
php > $timea=microtime(true); for($i = 0; $i < 10000000; $i++) { str_replace(array('http:', 'https:','sftp:','ftp:'), '', 'http://www.google.com'); }; echo (microtime(true)-$timea);  echo "\n";
7.2881300449371

因此:

str_replace:           5.4193 s     0.0000054193 s/call
preg_replace (with ^): 5.9864 s     0.0000059864 s/call
preg_replace (no ^):   5.8695 s     0.0000058695 s/call

更多可能的部分(包括sftpftp):

str_replace:           7.2881 s     0.0000072881 s/call
preg_replace (no ^):   6.0902 s     0.0000060902 s/call

是的str_replace is where it's at。而是相对于协议 link。

<?php echo str_replace(array('http:', 'https:'), '', 'http://www.google.com'); ?>

输出

//www.google.com

符合预期。否则,您可以使用 preg_replace,这将允许您使用正则表达式或正则表达式。 CommuSoft 发布了一个带有很好示例的答案。