2016-10-28 3 views
0

にトリム機能で一部の文字を防ぐために、私は私が'"'(二重引用符)をトリムするトリム機能を使用する変数エスケープ文字の後に1を除いてどのようにPHP

$str = '"100 \""'; 

内の文字列を持っているキャラクター。私はそれを防ぐことができますどのように

$str = trim($str, '"'); 

しかし、それはすべて二重引用符をトリミングされ、 だから誰も私を伝えることができますか? とにかく自分のトリム関数を書いていますが、PHPの標準API関数を使いたいと思っています。

+2

'preg_replace'はあなたが探しているものです。あなた自身の正規表現を最初に書くようにしてください。あなたが立ち往生している場合は、あなたが試したことの詳細を質問を更新してください –

+0

あなたのトリム機能はどのように見えますか?ここで同じ解決策を避けるために... – jeroen

+0

単純な方法は、文字列の最後の記号がバックスラッシュの場合は、すべての引用符をトリムしてもう一度追加することです。とにかく、正規表現を使用するときれいです – ByteHamster

答えて

2

非常によく、私はかみ合うでしょう。あなたが使用する必要があるのは、正規表現でのネガティブなルックバックです。式は、それの最も単純な形で次のようになります。

/(?<!\\)"/ 

内訳:

  • (?<!:負の後読み。
  • \\):後読みパターンこれは、式が一定のパターンが先行しないであることを確認したいということを意味します。この場合、パターンは、先行する文字が\でない場合にのみ一致します。
  • ":Aリテラル"。また、ルックバックのために、エスケープされた二重引用符は一致しません。あなたのケースではdemo

は、おそらく探している:

$str = preg_replace('/(?<!\\)"/', '', $str); 

は、空の文字列(基本的にそれらを取り除く)でエスケープされていないすべての"を交換します。


trimを使用しているため、先頭と末尾の引用符のみを削除することができます。その場合、あなたは表現にほんの少し変更する必要があり、これを使用します:

/(?<!\\)(^"|"$)/ 

内訳:

  • (?<!\\):前と同じ(負の後読み)
  • (^"|"$):文字列の先頭または末尾である場合に限り、リテラル"と一致します。

はもちろん、あなたは本当に一流の引用のための後読みを必要としないので、この表現は、同じように良い(そうでない場合は、より良い)に動作します:

/(^"|(?<!\\)"$)/ 

内訳:

  • ^":文字列の最初の文字がエスケープされていない場合は、"に一致します。
  • (?<!\\):同じ古い負の後方参照
  • "$:これらの正規表現のの両方ができるようになります負の後読みどおり

、それは\が先行していない場合にのみ、(文字列の末尾に二重引用符をマッチあなたはこのような文字列を処理します

$str = '"foo"bar\""'; 
echo preg_replace('/(^"|(?<!\\)"$)/', '', $str); 

出力foo"bar\"

Demo II

+0

あなたの正規表現が動作していることを確認してください、私のケースではnullを返しています –

+0

@KshitijYelpale:正規表現が期待どおりに動作するように見える2つのデモリンクを追加しました –

0

正規表現の置換は、ネガティブなビヘイビアードで試してください。このような表現は、このトリックを行うべきです:

(?<!\\)" 
関連する問題