3

元気ですか?次の仕事があります。重複したスラッシュを含む可能性のある文字列がたくさんあります。重複するスラッシュを 1 つのスラッシュ (任意の数のスラッシュ) に置き換える必要がありますが、スラッシュの後に次の記号 (引用符、二重引用符、NUL (NULL バイト)) が見つかった場合、すべてのスラッシュを削除する必要があります。ありがとう。私の言語 - PHP。いくつかのテスト:

$s1 = 'test\\\\string';
// test\string
$s2 = 'test\\\\\"\\\\\'\\\\string';
// test"'\string
$s3 = 'test\\string\\\\\"';
// test\string"
4

5 に答える 5

5

使用する

preg_replace("~\\\\+([\"\'\\x00\\\\])~", "$1", $string);

任意の量を\1つだけに置き換え\ます。

パターンは、任意の初期バックスラッシュと、、、、、またはのいずれかである\\\\+後続の記号で構成されます。交換により、先行するバックスラッシュが効果的に除去されます。"'\x00\

正規表現には4つの円記号が必要です。PHPインタープリターはバックスラッシュを使用してまたはなどの特殊文字をエスケープするため、2つのバックスラッシュ(\\)は正規表現文字列内に1つのバックスラッシュ( )になります。同じ理由で、正規表現内に2つのバックスラッシュが必要になります。\"\

または、逆に説明します。正規表現として取得\+するには、バックスラッシュを追加して、1つのバックスラッシュがをエスケープするためのものではないことをPCREに通知する必要があります+。文字列として取得するに\\+は、各バックスラッシュの前に1つのバックスラッシュを追加して、2番目のバックスラッシュを最初のバックスラッシュでエスケープしたくないことをPHPインタープリターに通知する必要があります。

ソースコード:\\\\+

正規表現文字列内:\\+

パターンの一致:\+

于 2012-04-05T09:25:24.523 に答える
2

2つ以上の連続するスラッシュを1つのスラッシュに置き換えます preg_replace('/\\\\+/','\\',$str);

于 2012-04-05T09:25:30.033 に答える
2

別の方法。

$s = 't\est\\\\\\\\\\\\stri\\\\\"\\\\\'\\\\0\\\\ng';
$s = preg_replace('~\\\\+~', '\\', $s);
$s = str_replace(array('\\"', '\\\'', '\\0'), array('"', '\'', "\0"), $s);
于 2012-04-05T09:43:50.253 に答える
1

これらを試してください:

preg_replace("/\\+(['\"\0\\])/", "$1", $string);
于 2012-04-05T09:34:09.667 に答える
0

ストリップスラッシュの何が問題になっていますか? 「特殊な」文字をエスケープするスラッシュを考慮し、「余分な」スラッシュを削除します。

于 2012-04-05T09:20:27.127 に答える