Php 如何将空格替换为%20英寸<;img>;标签

Php 如何将空格替换为%20英寸<;img>;标签,php,regex,preg-replace,Php,Regex,Preg Replace,我想替换html文本的图像标记中的所有空格 例如: <img src="photo 1.jpg" /> 到 我没有找到带有preg_replace的soultion,但它可能是一个简单的regexp行。 谢谢 编辑:对不起,伙计们,我的描述不太清楚。因此,我有一个完整的html页面,我只想替换img标记中的内容。我不能在这里使用urlencode,因为它也对其他内容进行编码。编辑 我可能没有抓住要点,如果你没有扫描已经写出的HTML,这可能不适合你。这是为了如果你因为任何原

我想替换html文本的图像标记中的所有空格

例如:

<img src="photo 1.jpg" />


我没有找到带有preg_replace的soultion,但它可能是一个简单的regexp行。 谢谢

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

编辑

我可能没有抓住要点,如果你没有扫描已经写出的HTML,这可能不适合你。这是为了如果你因为任何原因而放弃它。我把它留给纯粹的怀旧,因为它可以帮助其他想要刮擦和替换的人。很抱歉给你带来了困惑


因为您知道标记和属性,所以我建议您通过查看。正则表达式可以做到这一点,但鉴于您所看到的上下文,DOM将是首选,并且可能更容易/更可靠。这将扫描生成的HTML并允许您替换属性(在本例中为
src
)中的项目,使用可以将空格转换为%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();

类似于以下的操作可能会起作用:

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

但是有点难说,因为您没有告诉我们任何关于
preg_replace
为什么不起作用的细节,它的输出是什么,等等。

在url中,空间由%20表示,但是您可能希望为其他图像转换其他字符,因此您应该使用通用的urlencode函数,而不是使用“简单正则表达式”如OP中所述

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

这就是您需要的
rawurlencode()

嘿, 我找到了一个简单的解决方案,使用preg\u replace\u回调。我以前从未听说过这个函数,但它很棒

在此处发布代码:

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

感谢您的回复。

您能给我们一个代码示例,或者您尝试过的更详细的想法吗?我尝试过一些简单的方法,比如preg_replace(“/\s/”,“%20”…),但它显然会替换文本中的所有空格。必须有一种方法告诉php只在src=''部分内部进行替换,但我不知道如何使用urlencode对URL进行编码。使用preg_replace可以减少“有一个内置对象可以这样做”类型的内容。嘿,谢谢。你说得对,我应该提供更多的细节。我在php变量$text中有一个完整的html页面。里面有各种各样的html元素。我想替换所有img标记中图像URL中的所有空格。我只想注意,
/g
修饰符是不必要的,并且不做任何事情,因为PHP中没有全局修饰符(默认为全局修饰符):@brad几乎正确,但对于空间编码,您需要获得%20而不是+的值。+1。这将正确地处理
等问题。@ikegami,可能不会。可以使用
basename
仅获取实际文件名,也可以使用
explode
。如果需要,OP可以扩展这段代码来做需要的事情:)谢谢你提出这一点,因为它很容易被忽略。@Brad F Jacobs,我会提供一个解决方案,但我不懂PHP。在Perl中,
$src=URI->new($src)->作为字符串
就可以了(而且
->因为字符串可以省略)。为了澄清@ikegami的评论,
rawurlencode
只会正确处理文件名。如果传递诸如“images/hello world.jpg”之类的路径,“/”也将被编码并导致404。
urlencode()
将用
+
rawurlencode()替换空格
是符合目的的正确函数。我甚至没有注意到lol。你确实发布了一个比我更好的答案:)
rawurlencode
urlencode
只能正确处理文件名。如果传递一个路径,例如“images/helloworld.jpg”,那么“/”也会被编码,并导致404。
$text = preg_replace_callback("/src=[\'\"](.*?)[\'\"]/", "removeSpaces", $text);
function removeSpaces($matches) {
  return "src='" . str_replace(" ", "%20", $matches[1]) . "'";
}