我有一些遗留代码我试图更新以在PHP 5.4上运行:
$row['subject'] = ereg_replace('[\]', '', $row['subject']);
我知道我必须用preg_replace替换它,但由于我从未使用过ereg,我不确定这实际上是做什么的。
是等效的:
preg_replace('/[\\]/'...
或
preg_replace('/\[\\\]/'...
任何人都可以了解正确的替代品应该是什么?
答案 0 :(得分:2)
您发布的代码没有替换反斜杠,它与方括号不匹配;它们用于创建仅包含反斜杠字符的字符范围,并且在regex
上完全无用。
等效的preg_replace()
语句是:
$row['subject'] = preg_replace('/\\\\/', '', $row['subject']);
regex
是/\\/
。使用单个反斜杠(\
)会产生错误;反斜杠是regex
中的转义字符,它转义/
使其按字面解释而不是分隔符。需要两个额外的反斜杠,因为反斜杠也是PHP
中的转义字符,它也需要进行转义。
我想这就是原始编码器将反斜杠括在一个范围内的原因,以避免逃逸和双重逃逸的需要。
使用相同的技巧,您可以使用preg_replace()
将其编写为:
$row['subject'] = preg_replace('/[\]/', '', $row['subject']);
单个反斜杠就足够了。在regex
the backslash escapes are not allowed in character ranges中。在PHP单引号字符串中,反斜杠只有在它是字符串中的最后一个字符时才需要进行转义。
(我知道,documentation告诉我们将所有反斜杠加倍,但是,另一方面,它表示反斜杠不在撇号或单引号字符串中的另一个反斜杠之前从字面上解释。)
回到regex
,有一种更好(更快,更干净)的方式可以将上述调用重写为ereg_replace()
:不使用regex
所有。因为它只是匹配(并替换)反斜杠,所以您不需要使用regex
。一个简单的str_replace()
就足够了:
$row['subject'] = str_replace('\\', '', $row['subject']);