2012-01-14 19 views
1

文字の前にバックスラッシュが奇数か偶数かどうかを確認するにはどうすればよいですか? PHPはシングルとダブルのバックスラッシュを同じに見ます!私は、その文字をエスケープかいないされているチェックしたいシングルバックスラッシュとダブルバックスラッシュの違い

$str = "\a\\b\\\c"; 
echo preg_replace("/\\\/", "+", $str); // +a+b++c 
echo preg_replace("/\x{005c}/u", "+", $str); // +a+b++c 

echo strlen($str); // 7 
for($i=0; $i<strlen($str); $i++) 
    echo bin2hex($str{$i}).', '; 
// Output: 5c, 61, 5c, 62, 5c, 5c, 63 

: 以下のコードを見てみてください! "\\"、 " \":


どのようにこれらの2つの文字列の間の違いを確認するには? はdate()関数と似ています。

おかげで、

答えて

1

\a\\aと同じかもしれませんが、\nは間違い\\nと同じではありません。次の文字を含むバックスラッシュが特殊なシーケンスに解決された場合、バックスラッシュはエスケープ文字として機能します。さもなければ、バックスラッシュは単にバックスラッシュです。

+0

date()関数のように解析する方法は?これは、奇数 - バックスラッシュが偶数 - バックスラッシュと等しくないことを意味しますか? – AHHP

+0

文字列リテラルの構文と文字列の内容を区別する必要があります。 @ \は\のエスケープシーケンスであり、 '\ a'、' \ b'と '\ c'は有効なエスケープシーケンスではないので、@ dgunchevは文字列が' \ a \ b \\ c'であると言います。 – Amadan

1

あなたの文字列が実際に\a\b\\cある - \aは、したがって、それは\aなり、違いを確認するために、有効である、しかし\nを試し、無効なエスケープシーケンスです。

+0

実際には、バックスラッシュのエスケープをシミュレートしたいと思います。 date()関数の書き換えを検討してください。だから私は文字列を解析し、奇数とバックスラッシュで何かを別々にする必要があります。 – AHHP

+0

私はあなたがここにいるのですが、物事を簡単にするために、コードに埋め込むのではなく、テキストファイルから行を読み上げてみてください。埋め込み時に、PHPインタプリタは最初にバックスラッシュを処理します。または、試してみてください: '$ bsl =" \\ "; ' ' $ str = $ bsl。 "a"。$ bsl。$ bsl。 "b"。$ bsl。$ bsl。$ bsl。$ bsl。 " ' ... –

1

短い答えは正規表現ではできないということです。それを保証するために必要な可変長のルック・ビハインドアサーションを行うことはできません。私はそのような文字列を探して、一度だけのサブパターンで最適化された非常に良い仕事をした正規表現を書くことができましたが、バッファオーバーフローを引き起こし、多くの一致が発生したときにスクリプトをクラッシュさせることがありました。

strcspn()をご覧ください。これは、カスタムの解析関数を書くのに非常に適しています。停止文字として\を使用できます。それから、次のキャラクターで、それが特別ならばそれに行動し、そうでなければ先に飛びます。正規表現よりも高速に動作します。

関連する問題