2

我有一些我正在尝试更新以在 PHP 5.4 上运行的遗留代码:

$row['subject'] = ereg_replace('[\]', '', $row['subject']);

我知道我必须用 preg_replace 替换它,但由于我从未使用过 ereg,我不确定这实际上是做什么的。

是等价的:

preg_replace('/[\\]/'...

或者

preg_replace('/\[\\\]/'...

谁能阐明正确的替代品应该是什么?

4

1 回答 1

2

您发布的代码将反斜杠替换为任何内容,并且与方括号不匹配;它们用于创建仅包含反斜杠字符的字符范围,并且在您的regex.

等效的preg_replace()语句是:

$row['subject'] = preg_replace('/\\\\/', '', $row['subject']);

regex/\\/。_ 使用单个反斜杠 ( \) 会产生错误;反斜杠是 中的转义字符regex,它转义/使其按字面解释而不是作为分隔符。需要两个额外的反斜杠,因为反斜杠也是转义字符,PHP也需要转义。

我想这就是原始编码器将反斜杠包含在一个范围内的原因,以规避转义和双重转义的需要。

使用相同的技巧,您可以将其编写preg_replace()为:

$row['subject'] = preg_replace('/[\]/', '', $row['subject']);

一个反斜杠就足够了。在regex 反斜杠中,字符范围内不允许转义。而在 PHP 单引号字符串中,反斜杠只有在它是字符串的最后一个字符时才需要转义。

(我知道,文档教我们将所有反斜杠加倍,但另一方面,它说单引号字符串中不在撇号或另一个反斜杠之前的反斜杠按字面意思解释。)

回到regex,有一种更好(更快,更简洁)的方法可以将上述调用重写为ereg_replace()根本不使用regex。因为它所做的只是匹配(和替换)反斜杠,所以您不需要使用regex. 一个简单str_replace()的就足够了:

$row['subject'] = str_replace('\\', '', $row['subject']);
于 2015-07-06T21:33:31.727 回答