2

私のメソッドは文字列を解析し、文字列に含まれる情報を処理します。簡単な例は

$string=
"
    user:name,password={$_POST['name']}, {$_POST['password']}(md5); 
    names:name=name;
";
$class->$method($string);

上記は 2 つの挿入ステートメントを実行します。1 つ目は、user という名前のテーブルに、md5 で暗号化されたユーザー名とパスワードを挿入します。
2 番目は名前テーブルに名前を挿入します。文字をエスケープできるように設定しています。つまり、ユーザー名が p;ez の場合です。文字列には p\;ez が含まれます。
私の現在の方法は次のとおりです

    #get position of ;
    $offsetSemi=stripos($s, ";");
    #check if its escaped
    if ($s[$offsetSemi-1]!='\\')
    {
        //not escaped
    }

上記の方法の問題は、; の最初のインスタンスのみをチェックすることです。私が試した他の解決策は、; で文字列を爆発させることでした。ただし、エスケープされたものを含むすべてのインスタンスで爆発したため、これは機能しません。私が試したもう1つのことは、以下の正規表現で爆発することでした

/[^\\\];/

これに関する問題は、以前に文字で爆発したことです。エスケープされなかったすべてのインスタンスで。のすべてのインスタンスで文字列を爆発させる方法はありますか ; バックスラッシュが前に付いていない?

4

3 に答える 3

2

爆発する代わりに、文字列を解析できます。

$arr = array();
$tmp = "";

for ($i = 0; $i < strlen($s); $i++) {
   switch ($s[$i]) {
      case "\\":
         if ($i < strlen($s) - 1) $tmp .= $s[$i++] . $s[$i++];
      break;
      case ";":
         $arr[] = $tmp;
         $tmp = "";
      break;
      default:
         $tmp .= $s[$i];
   }
}

if (strlen(trim($tmp)) > 0) { // last section
    $arr[] = $tmp;
}
于 2011-08-11T22:44:29.860 に答える
2

入力形式に JSON を使用することを検討してください。PHP を使用しているため、JSON と PHP の紹介をご覧ください。また、 json_encode()json_decode( )を使用する必要があります。これらの関数を使用すると、JSON 文字列を PHP オブジェクトまたは連想配列に簡単に変換し、必要に応じて元に戻すことができます。解析ヘルプが組み込まれている形式で開始する場合、トークン化/解析の手順について心配する必要はありません。

XML を使用する場合は、 SimpleXMLまたはDOMを使用できます。ただし、JSON を使用するのが最善の方法です。

于 2011-08-11T23:11:12.233 に答える
0

パーサーを書きます。最初に入力をトークン化してから、それを見てください。

于 2011-08-11T22:39:35.870 に答える