我有以下代码:
$replacement = array("$12.00", "Sue-ellen");
for ($i = 0; $i < count($replacement); $i++) {
$replacement[$i] = preg_quote($replacement[$i]);
}
$message = preg_replace($regex, $replacement, $message);
我期待$message
成为“嗨Sue-ellen这里是12.00美元”然而它返回“Hi Sue \ -ellen这里是$ 12 \ .00”
我想知道它为什么会留下转义字符,以及如何绕过它。
我目前正在使用$message = preg_replace("/\\/", "", $message);
作为止损,但我确信这是一种更“优雅”的方式。因为将来可能会有一个用例,他们希望在输入中使用\
。
修改
$message = "Hi <firstname> here is <value>"
更改为preg_quote($regex)
$regex = array('/<firstname>/i', '/<value>/i');
这导致了
$message = "Hi Sue-ellen here is 2.00"
答案 0 :(得分:0)
preg_quote
用于转义在正则表达式中具有特殊含义的字符。替换字符串不会针对这些转义序列进行解析,而是按字面意思保存。
您好像试图阻止$12
中的$12.00
被视为对捕获组的反向引用。这是替换字符串中唯一的特殊序列。可以找到用于转义此功能的函数here
// Escape backreferences from string for use with regex
function preg_escape_back($string) {
// Replace $ with \$ and \ with \\
$string = preg_replace('#(?<!\\\\)(\\$|\\\\)#', '\\\\$1', $string);
return $string;
}
所以你可以这样做:
$replacement = array_map('preg_escape_back', $replacement);