2016-06-22 17 views
-1

私は以下のテキストを持っていますが、私は\'を取り除こうとしています。望ましい出力は"Gigi DAgostino"です。preg_replaceを使ったバックスラッシュの置換

"Gigi D\'Agostino" 

私はpreg_replaceでバックスラッシュを置き換えに関するいくつかの他の質問をチェックし、私はそれをエスケープ倍にする必要があることを学びました。だから私はいくつかの実験をしました。

echo preg_replace("/\\\/", "", "Gigi D\'Agostino"); // Gigi D'Agostino 
echo preg_replace("/'/",  "", "Gigi D\'Agostino"); // Gigi D\Agostino 
echo preg_replace("/\\\\'/", "", "Gigi D\'Agostino"); // Gigi DAgostino 

これまでのところ、とても良いです。これらは意味をなさない。しかし、私の実際のコードでは、パターンの一重引用符を使用しました。

echo preg_replace('/\\\/', "", "Gigi D\'Agostino"); // Gigi D'Agostino 
echo preg_replace('/\'/',  "", "Gigi D\'Agostino"); // Gigi D\Agostino 
echo preg_replace('/\\\\\'/', "", "Gigi D\'Agostino"); // Gigi DAgostino 

また、最初の2つの意味があります。私は3番目を手に入れません。なぜ余分なスラッシュが必要ですか?

'/ (\\)->\  (\)->' /' 
    ^   ^
     |    | 
    these two  this one 
    escape the  escapes 
    next \   the following ' 

エクストラ(5 番目\の役割は何ですか?

私は正規表現についてよく知らないので、ここでは本当に簡単なことがあります。

PS:私はバックスラッシュを置き換える方法を探していません。上記の例はすでにそうしています。私はそれがしている方法を理解しようとしています。


$str = "Gigi D\'Agostino"; 

# \ escapes ' 
echo preg_replace('/\'/', "", $str) . PHP_EOL; # "Gigi D\Agostino" 

# can't escape \ with a single \. it requires two \ 
echo preg_replace('/\\/', "", $str) . PHP_EOL; # No ending delimiter '/' found 

# \\ escapes the third \ 
echo preg_replace('/\\\/', "", $str) . PHP_EOL; # "Gigi D'Agostino" 

# now we combine the patterns. we replace \' 
# we need to escape both \ and ' 
# double backslashes to escape \, and a single backslash to escape ' 
# makes four backslashes and an apos: \\\ \' 
# but ofc, this doesn't work. requires an additional \ 
echo preg_replace('/\\\\\'/', "", $str) . PHP_EOL; # "Gigi DAgostino" 
+0

http://php.net/manual/en/function.stripslashes.phpを使用しない理由は何ですか? – chris85

+0

単一引用符で囲まれた文字列では、バックスラッシュ*がエスケープします。*と一重引用符。 PCREはエスケープされたバックスラッシュを必要とします。文字列を単に 'print'して、トークン化された実際の文字列値を確認します。 – mario

+0

@ chris85また、私は2D配列[パターン、代替]で保持している他の文字を取り除く/置き換えています。それに、私は物事の底に行きたい。 – akinuri

答えて

0

あなたが使用することができますstr_replace()関数

echo str_replace("\'","","Gigi D\'Agostino") 
0

あなたは(エスケープ何もなし)'/'/'などの単一引用符で囲まれた区切られたパターンでの起動する場合は、区切り文字に気付くでしょう/単一引用符で囲まれたパターンの外側にあるため、エラーが発生します。 \を使用して'をエスケープすると、区切り文字がシングルクォートパターンに戻り、シングルクォートがエスケープされます。そのプロセスをパターン\'を使用して続けると、何が起こっているのかが明らかになり、そのプロセス自体のパターンに気付くはずです。

 '/'/' - error:/delimiter outside of pattern 
    '/\'/' - escape ' 
    '/\\'/' - escape \, unescape ', error:/delimiter outside of pattern 
    '/\\\'/' - escape ', unescape \ 
'/\\\\'/' - escape \, unescape ', error:/delimiter outside of pettern 
'/\\\\\'/' - escape ', escape \ 

あなたがパターンに別の\を継続し、追加した場合は、発生する何が起こっているかを推測しますか?うん、パターン外のデリミタ...これは何が起こっているのかを少し光らせてくれることを願っています。

+0

遅く返事を申し訳ありませんが、私はまだそれの周りに私の頭を包むことはできません。パターンに "\"を追加/削除して実験を行うと、最終的な結果しか得られません。私はそれに興味がありません。エスケーププロセスについて知りたい。アップデートを参照してください。私の混乱がどこから起きるかを示すのに十分なことは間違いないと思います。 – akinuri

関連する問題