1

でエラー制御演算子を使用せずにこれを行う方法はあります@preg_matchか?:)

PHPではパターンを文字で囲む必要があるため、次のように考えていました。

  1. 最初の文字を取得します。
  2. 次の文字列でこの文字が最後に出現する場所を見つけます。

    $rpos = strrpos($string, $string[0]);
    
  3. 修飾子リストを取得します。

    $mods = substr($rpos, strlen($string));
    
  4. このリストに無効な修飾子があるかどうかを調べます。falseが返される場合、それ以外の場合、正規表現は有効であるように見えます。

このソリューションはどの程度信頼できますか?より良いものはありますか?

4

2 に答える 2

2

私は常にSymfony2Finderコンポーネントでこの関数を使用しています:

if (preg_match('/^(.{3,}?)([imsxuADU]*)$/', $expr, $m)) {
    $start = substr($m[1], 0, 1);
    $end   = substr($m[1], -1);

    if (($start === $end && !preg_match('/[*?[:alnum:] \\\\]/', $start)) || ($start === '{' && $end === '}')) {
        // It's a regex!
    }
}
于 2013-03-26T19:59:03.087 に答える
1

コメットでは、それはすでに短い方法で説明されています。filter_varただし、この方法を使用すると、正規表現に問題がないかどうかを確認できます。

$string = "String to match";

if (filter_var($string, FILTER_VALIDATE_REGEXP, array("options" => array("regexp" =>  "/abc/")))) {
    echo "Regex is OK";
} else {
    echo "Regex not okay";
}
于 2013-03-26T20:07:04.440 に答える