非常によく、私はかみ合うでしょう。あなたが使用する必要があるのは、正規表現でのネガティブなルックバックです。式は、それの最も単純な形で次のようになります。
/(?<!\\)"/
内訳:
(?<!
:負の後読み。
\\)
:後読みパターンこれは、式が一定のパターンが先行しないであることを確認したいということを意味します。この場合、パターンは、先行する文字が\
でない場合にのみ一致します。
"
:Aリテラル"
。また、ルックバックのために、エスケープされた二重引用符は一致しません。あなたのケースではdemo
は、おそらく探している:
$str = preg_replace('/(?<!\\)"/', '', $str);
は、空の文字列(基本的にそれらを取り除く)でエスケープされていないすべての"
を交換します。
trim
を使用しているため、先頭と末尾の引用符のみを削除することができます。その場合、あなたは表現にほんの少し変更する必要があり、これを使用します:
/(?<!\\)(^"|"$)/
内訳:
(?<!\\)
:前と同じ(負の後読み)
(^"|"$)
:文字列の先頭または末尾である場合に限り、リテラル"
と一致します。
はもちろん、あなたは本当に一流の引用のための後読みを必要としないので、この表現は、同じように良い(そうでない場合は、より良い)に動作します:
/(^"|(?<!\\)"$)/
内訳:
^"
:文字列の最初の文字がエスケープされていない場合は、"
に一致します。
(?<!\\)
:同じ古い負の後方参照
"$
:これらの正規表現のの両方ができるようになります負の後読みどおり
、それは\
が先行していない場合にのみ、(文字列の末尾に二重引用符をマッチあなたはこのような文字列を処理します
$str = '"foo"bar\""';
echo preg_replace('/(^"|(?<!\\)"$)/', '', $str);
出力foo"bar\"
'preg_replace'はあなたが探しているものです。あなた自身の正規表現を最初に書くようにしてください。あなたが立ち往生している場合は、あなたが試したことの詳細を質問を更新してください –
あなたのトリム機能はどのように見えますか?ここで同じ解決策を避けるために... – jeroen
単純な方法は、文字列の最後の記号がバックスラッシュの場合は、すべての引用符をトリムしてもう一度追加することです。とにかく、正規表現を使用するときれいです – ByteHamster