preg_quote和preg_match留在转义的\

时间:2018-04-05 00:45:57

标签: php regex

我有以下代码:

$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"

1 个答案:

答案 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);