0

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

    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';

4

1 回答 1

1

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

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

下面的例子证明了这一点:

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

一些选择是:

  • 双逃。
  • 通过将破折号放在末尾来避免正则表达式转义:/[^a-z 0-9~%.:_()"-]/
  • 如果preg_quote()您要接受字符串正则表达式语法,请使用。

注意:我鼓励您阅读有关在字符类中转义的内容。

于 2013-01-29T17:58:17.257 回答