我目前正在开发一种替换工具,它将使用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;)它的工作原理。
答案 0 :(得分:0)
可能是像变形金刚这样的特殊字符没有正确地显示在实时服务器上,因此如果要替换的字符串中有特殊字符,则str_replace()
会失败。
答案 1 :(得分:0)
两个系统上的输入字符串是否相同?你验证了吗?你确定吗?
要检查的事项:
<a href='#'>
vs <a href="#">
)
vs  
- 相同的字符;不同的HTML)任何这些事情都会影响结果,并产生你所描述的失败。
答案 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失败了:)