2016-12-16 5 views
1

私は1つのPHPアプリケーションで動かなくなってしまう比較的単純な作業であると思われます。私は\nの束を持っている文字列を持っています。それらはうまくあり、そこにとどまる必要があります。しかし、文字\の1回の出現もあります。置き換えたり削除したりする必要がある文字は、nが続く文字列を削除せずに空の文字を使用してみましょう。nの後にnがない場合は、をすべて置き換える方法は?

私が思いついた最高のは、まず\nに奇妙な文字をバックに変換後、空のスペースで、残りの\を交換して、何か他のもの、いくつかの奇妙な文字で、すべての\nを交換しました。しかし、それは時間とリソースの無駄であると思われますが、文字列の残りの部分で決して遭遇しない奇妙な文字を見つけることはできません。

ヒント?

+0

どの正規表現を試しましたか? – happymacarts

+3

'preg_replace( '〜\\\\(?! n)〜'、 ''、$ s)'でしょうか? –

+0

なぜ正規表現が必要ですか?あなたは '\ n'または' \\ n'を持っていますか? '\ n'の\は**ではなく**です。これをチェックしてください:http://sandbox.onlinephpfunctions.com/code/ea7362ab63707e8e615a2090775b8f28ff94809b – Dekel

答えて

3

あなたは

$s = preg_replace('~\\\\(?!n)~', '', $s); 

を必要としPHP demoを参照してください:

$s = '\\n \\t \\'; 
$s = preg_replace('~\\\\(?!n)~', '', $s); 
echo $s; // => \n t 

私たちは、n個2つのリテラル・バックスラッシュを正規表現エンジンに渡して、入力文字列中の1つのリテラル・バックスラッシュと一致させるために4つのバックスラッシュをeedします。 (?!n)は、nの直後にあるバックスラッシュのすべての一致に失敗するネガティブ先読みです。

+0

説明ありがとうございます、魅力的です! – mmvsbg

+0

また、[PHP文字列リテラル参照](http://php.net/manual/en/language.types.string.php)を参照してください。*リテラル単一引用符を指定するには、バックスラッシュ( '' \ ')。* - 一重引用符と二重引用符の両方の文字列リテラルです。 –

1

あなたは否定先読みアサーションでこれを行うことができる必要があります:バックスラッシュのため

\\(?!n) 

\\ルックス、(?!n)は、次の文字がnではなく、文字と一致しないことを主張します。

PHPでこれを使用するには:ここ

$text = 'foo\nbar\nb\az\n'; 
$newtext = preg_replace('/\\\\(?!n)/', '', $text); 

詳細:https://regex101.com/r/F2qhAP/1

+0

この正規表現は、他の回答よりもはるかに単純に思えます。+1の否定的な先読みアサーション – happymacarts

関連する問題