如何在<img>标签中将空格替换为%20

3
我希望替换HTML文本中所有图片标签中的空格。
例如:
<img src="photo 1.jpg" />

to

<img src="photo%201.jpg"/>

我在使用 preg_replace 时没有找到解决方案,但可能只是一个简单的正则表达式。谢谢!

编辑:对不起,我的描述不太清楚。因此,我有一个完整的HTML页面,我只想替换 img 标签中的内容。我不能在这里使用 urlencode,因为它也会编码其他内容。


1
你能给我们提供一个代码示例,或者更详细的尝试过的想法吗? - Wylie
我尝试了一些简单的东西,比如preg_replace("/\s/", "%20"...), 但它显然会替换文本中的所有空格。肯定有一种方法可以告诉php只在src=''部分内替换,但我不知道怎么做。 - sydo
使用urlencode对URL进行编码。使用preg_replace来做一些少量的“有内置对象可以完成这个任务”的事情。 - James
5个回答

7

编辑

如果你不是在扫描已经编写好的 HTML 内容,那也许本文不适合你。此文旨在介绍如何删除 HTML 内容,以便于进行各种操作。我把它保留下来,仅仅是因为它可能会帮助到其他想要进行内容删除的人们。对于造成的混淆,敬请谅解。


既然你已经了解了标签和属性,我建议你使用 PHP DOM 进行操作。虽然正则表达式也可以实现这个功能,但是在这种情况下,DOM 更加可靠、更加易用。这个库将扫描生成的HTML并允许你替换属性内部的项目(如:这里的src),同时你也可以采用 rawurlencode() 来将空格转换为 %20。

<?php
$dom = new DOMDocument();
// $dom->load('test.html'); // if in a file
$dom->loadHTML($html); // if in a string

for ($i=0; $i<$dom->getElementsByTagName('img')->length; $i++) {
    $encoded = implode("/", array_map("rawurlencode",
         explode("/", $dom->getElementsByTagName('img')
                    ->item($i)->getAttribute('src'))));

    $dom->getElementsByTagName('img')
            ->item($i)
            ->setAttribute('src',$encoded);
}


echo $dom->saveHTML();

我处理了我的小测试文件,这只是一个示例,说明如何完成它 :)


@brad 差不多正确,但你需要使用 rawurlencode 来获取 %20 而不是 + 作为空格编码。 - Mel
+1。这将正确处理<img src="photo&#32;1.jpg">等内容。 - ikegami
@ikegami,可能不行。可以使用basename仅获取实际文件名或者使用explode。如果需要,OP可以扩展此代码以执行所需操作 :) 谢谢您提出这个问题,因为它很容易被忽视。 - Jim
@Brad F Jacobs,我可以提供一个解决方案,但是我不懂PHP。在Perl中,$src = URI->new($src)->as_string; 可以实现(->as_string 可以省略)。 - ikegami
为了澄清@ikegami的评论,rawurlencode只会正确处理文件名。如果传递的是像“images/hello world.jpg”这样的路径,则“/”也将被编码,并导致404错误。 - donut
增加了一个修复路径的功能。这个功能不会考虑以HTTP://等开头的URL,但如果使用相对路径,则应该可以正常工作。 - Jim

6

URL中的空格用%20表示,但是有其他字符需要转换成其他的图像,因此您应该使用通用urlencode函数而不是使用OP中所述的“简单正则表达式”。

<img src="<?php echo urlencode('file name.jpg'); ?>"/>

4
urlencode()会将空格替换为+,而rawurlencode()是符合目的的正确函数。 - Ibrahim Azhar Armar
我甚至没注意到,哈哈。你发了一个比我更好的答案 :) - BRampersad

4

这是你需要的:rawurlencode();

php.net/rawurlencode

提示:该函数用于将字符串进行 URL 编码,以便在 URL 中传递参数时使用。

2
rawurlencodeurlencode只会正确处理文件名。如果传递像"images/hello world.jpg"这样的路径,"/"也会被编码,导致404错误。 - donut

2

嗨, 我找到了一个简单的解决方案,使用 preg_replace_callback 函数。我以前从未听说过这个函数,但它很棒。

在此处发布代码:

$text = preg_replace_callback("/src=[\'\"](.*?)[\'\"]/", "removeSpaces", $text);
function removeSpaces($matches) {
  return "src='" . str_replace(" ", "%20", $matches[1]) . "'";
}

感谢所有回复。

1

像下面这样的内容可能有效:

$img_src = 'images/some crazy image.jpg';
$img_src = preg_replace('/ /g', '%20', $img_src);
echo '<img src="' . $img_src . '" alt="some image" />';

但是很难确定,因为您没有提供有关为什么preg_replace无法工作,其输出是什么等详细信息。


嘿,谢谢。你说得对,我应该提供更多细节。我有一个完整的HTML页面存储在PHP变量$text中,其中包含各种HTML元素。我想替换所有img标签内图像URL中的空格。 - sydo
1
只想指出,/g修饰符在PHP中是不必要的,并且没有任何作用(因为它默认是全局的):http://php.net/manual/en/reference.pcre.pattern.modifiers.php - JP Lew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接