PHP str_replace没有找到多行NOWDOC文本

时间:2014-10-26 14:10:59

标签: php file-get-contents str-replace nowdoc

我的理解是在PHP(v5.3及更高版本)中使用NOWDOC功能,不需要转义字符。

我正在尝试查找和替换PHP文件中的文本。文字是:

$OldString = <<<'EOD'
<fieldset class="foobar" id="comments">
<legend><?php echo TABLE_HEADING_COMMENTS; ?></legend>
<?php echo foobar_field('comments', '45', '3'); ?>
</fieldset>
EOD;

此文本确实出现在目标PHP文件中,但str_replace找不到它。 str_pos(我用于测试)也没有。

我想知道这是否是由字符串中的特殊字符引起的,但是如果我单独为strposstr_replace分别执行,则会找到每一行,例如......

$OldString = <<<'EOD'
<?php echo zen_draw_textarea_field('comments', '45', '3'); ?>
EOD;

......按照我的预期工作。

似乎是导致问题的多行,但HEREDOC和NOWDOC的重点在于它们可以将多行文本放入一个变量中。

我的搜索和替换字符串是:

$pos = strpos($content, $OldString);
if ($pos !== false) { 
   ...

$content = str_replace($OldString, $NewString, $content);

如果它有任何区别,我将使用file_get_contents从文件中获取文本。

1 个答案:

答案 0 :(得分:1)

与(strposstr_replace)相关的字符串函数是二进制安全。这意味着他们需要逐字节匹配字符串才能完全匹配。

您的示例显示了字符串中的换行符。根据平台,这些可能会有所不同。也许只是你正在寻找一个多行字符串,它在你读入的文件的字符串和你在PHP代码中定义的字符串中编码不同。

您可以通过创建它们的六角形来使您操作的字符串的二进制序列可见,从而轻松验证这一点:

另一个标志是当使用var_dump时,这些字符串显示意外的不同二进制长度。

相关问题