可能影响PHP str_replace行为的设置

时间:2012-08-10 11:24:34

标签: php string str-replace

我目前正在开发一种替换工具,它将使用smarty outputfilter动态替换网站中的某些字符串(包括html)。

为了进行替换,我使用PHP的str_ireplace方法,该方法读取应该替换的代码和数据库中的替换代码,然后将结果传递给smarty输出(使用输出过滤器),与下面的方法类似。

$tpl_source = str_ireplace($replacements['sourceHTML'], $replacements['replacementHTML'], $tpl_source);  

问题是,虽然它在我的开发服务器上运行良好,但一旦上传到实时服务器,替换偶尔会失败。相同的替换在我的开发版本上工作得很好。经过一些考试和谷歌搜索后,关于这个问题我找不到多少。所以我的问题是,什么会影响str_replace的行为?

由于

使用替换示例进行编辑:

$htmlsource = file_get_contents('somefile.html');
$newstr = str_replace('<a href="http://www.somelink">Some text</a>', 'sometext', $htmlsource);  // the text to be replaced does exist in the html source

无法替换。经过一些检查后,它看起来像“&gt;”的组合产生了一个问题。但只是它的组合。如果我只尝试改变(“)它的工作原理,如果我只尝试改变(&gt;)它的工作原理。

3 个答案:

答案 0 :(得分:0)

可能是像变形金刚这样的特殊字符没有正确地显示在实时服务器上,因此如果要替换的字符串中有特殊字符,则str_replace()会失败。

答案 1 :(得分:0)

两个系统上的输入字符串是否相同?你验证了吗?你确定吗?

要检查的事项:

  • HTML属性的顺序是否相同?
  • 属性值是否使用相同类型的引号? (例如<a href='#'> vs <a href="#">
  • 是否还有其他迷路HTML代码?
  • 实体编码是否相同? (例如&nbsp; vs &#160; - 相同的字符;不同的HTML)
  • 字符集是否相同? (例如,utf-8 vs ISO 8859-1:重音字符的编码方式不同)

任何这些事情都会影响结果,并产生你所描述的失败。

答案 2 :(得分:0)

这是一个trikcy问题,它最终与str_replace方法本身无关;

我们使用smarty作为篡改系统。 str_replace方法由smarty输出过滤器使用,以便在传递给用户之前更改某些ocassions中的html。

这是Smarty输出过滤器代码:

function smarty_outputfilter_replace($tpl_source, &$smarty)
{
    $replacements = Content::getReplacementsForPage();
    if (is_array($replacements))
    {
        foreach ($replacements as $replacementData)
        {
            $tpl_source = str_replace($replacementData['sourcecode'], $replacementData['replacementcode'], $tpl_source);
        }
    }
    return ($tpl_source);
}

因此,此代码现在已经失败了,现在显而易见......直到我意识到智能模板中的HTML代码被Apache过滤器操纵。

这导致浏览器中的源代码(我们使用的代码被替换为其他东西)与模板代码不同(smarty试图修改)。结果? str_replace失败了:)