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

答え


JasonMcCrearyに感謝します

$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 に答える