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