【问题标题】:How can I stop str_replace replacing only part of a filename?如何停止 str_replace 仅替换文件名的一部分?
【发布时间】:2011-10-03 20:32:42
【问题描述】:

我正在浏览一个 HTML 文件,用新文件替换所有对外部文件的引用,但是,有时这会导致错误。

例如:我想在此源代码中将所有styles.css 实例替换为1.css,并将iestyles.css 的所有实例替换为2.css

<html>
  <link href="styles.css" />
  <link href="iestyles.css" />
</html>

运行str_replace("styles.css", "1.css", $html); 后,源代码如下所示:

<html>
  <link href="1.css" />
  <link href="ie1.css" />
</html>

因此,当我运行第二个查询时,它不会更改 iestyles.css 引用,因为它不再存在。有没有解决的办法?我想我可以发明一个精心设计的正则表达式,但有很多变量需要考虑,因为并非所有代码都格式正确。

干杯

【问题讨论】:

    标签: php regex str-replace


    【解决方案1】:

    只需更改顺序:首先将iestyles.css 替换为2.css,然后将styles.css 替换为1.css

    如果您确定文件名是href-属性中的唯一内容,您还可以包含双引号"

    $html = str_replace('"styles.css"', '"1.css"', $html);
    $html = str_replace('"iestyles.css"', '"2.css"', $html);
    

    【讨论】:

    • OP 也可以替换第二个 ie1.css :)
    • 问题是,我不能确定文件名到底是什么——这只是一个例子。那么,如果有大量要替换的引用列表,我怎么知道首先要做什么呢?我也不确定是否使用了双引号或单引号,或者是否确实使用了引号。正如我所说,并非所有代码都是格式良好的。
    • “无引号”不仅是“格式不正确”,而且是损坏的。作为旁注;)但是,就像@cwallenpoole 建议从大到小替换它总是有用的。只需按长度对“来自”字符串进行排序就是一个好的开始。
    • 嘿,你建议的,我刚刚加了 1+。
    • 是的,这是一个好的开始,但不是解决方案。我说的是相当大的规模。可能有数百个要替换的引用,文件名可以是任何内容。我需要一种可靠的方法来确保正确更换每一个。
    【解决方案2】:

    包括双引号(假设它们都使用双引号)应该可以工作。

    str_replace('"styles.css"', '"1.css"', $html);
    

    【讨论】:

    • 是的,我不能确定它们总是双引号:\
    【解决方案3】:

    使用 preg_replace();

    preg_replace('|<link href="styles\.css" />|', '1.css', $html);
    

    或者只是在styles之前添加双引号

    str_replace('"styles.css', '"1.css', $html);
    

    【讨论】:

    • 我不能确定每次链接的格式都一样。
    【解决方案4】:

    只需在替换中包含引号即可。

    "styles.css" 替换为"1.css"

    【讨论】:

      【解决方案5】:

      您可以先更改“iestyles.css”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多