我有以下函数,如您所见,它用模式替换字符串中的某些字符,但它仅在我以字符串形式输入模式时才有效,就像在第一个注释掉的行中一样。 我在那里放了一个回声来测试回来的东西,它应该是这样,所以我不知道发生了什么! 有人有任何线索吗?
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
答
感谢杰森·麦克里
$pattern = '/[^'. preg_quote($this->config->item('permitted_uri_chars'), '/') .']+/i';
它在第一个示例中有效,因为您正确地转义了 PHP 和正则表达式的字符。(即 ''
)。
使用字符串时,您只对 PHP 进行了转义。因此,当您在正则表达式中使用此字符串时,它不再被转义。
以下示例对此进行了演示:
echo '/[^a-z 0-9~%'.:_''-()"]/i';
// becomes: /[^a-z 0-9~%'.:_'-()"]/i
一些选项是:
- 双重逃生。
- 通过将破折号放在末尾来避免正则表达式转义:
/[^a-z 0-9~%.:_()"-]/
- 如果要接受字符串正则表达式语法,请使用
preg_quote()
。
注意:我鼓励你阅读有关在角色类中转义的信息。