PHP str_replace不';找不到多行NOWDOC文本


PHP str_replace doesn't find multiline NOWDOC text

我的理解是,在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从文件中获取文本。

与(strposstr_replace)相关的字符串函数是二进制安全。这意味着它们需要逐字节地匹配字符串以实现精确匹配。

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

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

  • 如何在PHP中获得字符串的十六进制转储

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