替换 ereg_replace()

Replacing ereg_replace()

我有一些遗留代码,我想在 PHP 5.4 上更新到 运行:

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

我知道我必须用 preg_replace 替换它,但由于我从未使用过 ereg,所以我不确定它的实际作用。

相当于:

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

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

任何人都可以阐明正确的替换应该是什么吗?

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

上完全无用

等效的 preg_replace() 语句是:

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

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

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

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

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

一个反斜杠就足够了。在regexthe backslash escapes are not allowed in character ranges。在 PHP 单引号字符串中,反斜杠只有在它是字符串的最后一个字符时才需要转义。

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

回到regex,有一个更好(更快、更干净)的方法来重写上面对ereg_replace()的调用:不要使用regex 完全没有。因为它所做的只是匹配(和替换)反斜杠,所以您不需要使用 regex。一个简单的str_replace()就够了:

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