preg 替换 - PHP preg_replace不接受外部引用


preg replace - php preg_replace wont accept outside reference

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

    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()

注意:我鼓励你阅读有关在角色类中转义的信息。