php preg_replace不接受外部引用

时间:2013-01-29 17:47:22

标签: php preg-replace

我有以下功能,正如您所看到的,用模式替换字符串中的某些字符,但只有当我像第一个注释掉的行中那样输入字符串时,它才有效。我在那里放了一个回声来测试回来的东西,它应该如此,所以我不知道发生了什么!有人有任何线索吗?

    private function check_string( $s )
    {
        //return preg_replace( '/[^a-z 0-9~%\.:_\\-()"]/i', '', $s );

        // a-z 0-9~%\.:_\\-()"
        echo $this->permitted_uri_chars;

        // /[^a-z 0-9~%\.:_\\-()"]/i
        $pattern = '/[^'. $this->permitted_uri_chars .']/i';    
        return preg_replace( $pattern, '', $s );            
    }

我得到的错误是

Message: preg_replace(): Compilation failed: range out of order in character class at offset 18

ANSWER


感谢Jason McCreary

$pattern = '/[^'. preg_quote($this->config->item('permitted_uri_chars'), '/') .']+/i';

1 个答案:

答案 0 :(得分:1)

它在第一个示例中工作,因为您正确转义了PHP和正则表达式的字符。 (即\\)。

使用字符串时,您只能转义为PHP。因此,当您在正则表达式中使用此字符串时,它不再被转义。

以下示例说明了这一点:

echo '/[^a-z 0-9~%\.:_\\-()"]/i';
// becomes: /[^a-z 0-9~%\.:_\-()"]/i

有几种选择:

  • 双重逃脱。
  • 将短划线放在最后:/[^a-z 0-9~%.:_()"-]/
  • ,避免使用正则表达式
  • 如果您要接受字符串正则表达式语法,请使用preg_quote()

注意:我建议您阅读escaping inside character classes