【问题标题】:How to replace spaces with %20 in <img> tags如何在 <img> 标签中用 %20 替换空格
【发布时间】:2011-06-02 12:46:02
【问题描述】:

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

例子:

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

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

我没有找到 preg_replace 的灵魂,但它可能是一个简单的正则表达式行。 谢谢!

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

【问题讨论】:

  • 您能给我们一个代码示例,或者更详细地了解您的尝试吗?
  • 我尝试了一些简单的东西,比如 preg_replace("/\s/", "%20"...),但它显​​然替换了文本中的所有空格。一定有办法告诉 php 只替换 src='' 部分,但我不知道怎么做。
  • 使用 urlencode 对 url 进行编码。使用 preg_replace 来做更少的“有一个内置对象可以做到这一点”类型的东西。

标签: php regex preg-replace


【解决方案1】:

编辑

我可能错过了重点,如果您没有扫描已经写出的 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 而不是 + 用于空间编码。
  • +1。这将正确处理&lt;img src="photo&amp;#32;1.jpg"&gt; 等。
  • @ikegami,可能不是。可以使用basename 来获取实际文件名或explode。如果需要,OP 可以扩展此代码以执行所需的操作 :) 感谢您提出这一点,因为它很容易被忽略。
  • @Brad F Jacobs,我会提供解决方案,但我不懂 PHP。在 Perl 中,$src = URI-&gt;new($src)-&gt;as_string; 可以(而-&gt;as_string 可以省略)。
  • 为了澄清@ikegami 的评论,rawurlencode 只会正确处理文件名。如果传递诸如“images/hello world.jpg”之类的路径,“/”也会被编码并导致 404。
【解决方案2】:

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

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

【讨论】:

  • urlencode() 将用 + 替换空格,rawurlencode() 是符合目的的正确函数。
  • 我什至没有注意到大声笑。您确实发布了比我更好的答案:)
【解决方案3】:

这就是你需要的rawurlencode();

php.net/rawurlencode

【讨论】:

  • rawurlencodeurlencode 只会正确处理文件名。如果传递诸如“images/hello world.jpg”之类的路径,“/”也会被编码并导致 404。
【解决方案4】:

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

在这里发布代码:

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

感谢所有回复。

【讨论】:

    【解决方案5】:

    类似以下的方法可能会起作用:

    $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 为何不起作用、其输出是什么等的详细信息。

    【讨论】:

    • 嘿,谢谢。你是对的,我应该提供更多细节。我在 php 变量 $text 中有一个完整的 html 页面。里面有各种各样的html元素。我想替换所有 img 标签内的图像 url 中的所有空格。
    • 只是想注意 /g 修饰符是不必要的,并且什么也不做,因为 PHP 中没有全局修饰符(默认情况下是全局的):php.net/manual/en/reference.pcre.pattern.modifiers.php
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2021-07-25
    • 1970-01-01
    • 2013-10-06
    • 2012-07-22
    相关资源
    最近更新 更多