0

我目前正在开发一种替换工具,该工具将使用 smarty 输出过滤器动态替换网站中的某些字符串(包括 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

无法更换。经过一番检查,看起来 "> 的组合会产生问题。但只是它的组合。如果我尝试仅更改 (") 它有效,如果我尝试仅更改 (>) 它有效。

4

3 回答 3

0

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

于 2012-08-10T11:30:14.383 回答
0

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

检查事项:

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

这些事情中的任何一个都会影响结果并产生您所描述的失败。

于 2012-08-10T11:40:14.370 回答
0

这是一个棘手的问题,最终与 str_replace 方法本身无关;

我们使用 smarty 作为压印系统。str_replace 方法由 smarty 输出过滤器使用,以便在某些情况下更改 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);
}

所以这段代码时不时地失败了,原因很明显......直到我意识到 smarty 模板中的 HTML 代码正在被 Apache 过滤器操作。

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

于 2012-09-12T16:01:04.963 回答