0

我的理解是在 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(我正在使用它进行测试)。

我想知道这是否是由于字符串中的特殊字符造成的,但是如果我单独执行 astrposstr_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.

4

1 回答 1

1

您与 ( strpos, str_replace) 相关的字符串函数是二进制安全的。这意味着他们需要逐字节匹配字符串以获得精确匹配。

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

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

另一个迹象是当var_dump与这些字符串一起使用时会显示出意想不到的不同二进制长度。

于 2014-10-26T14:20:35.953 回答