2012-03-13 19 views

答えて

2

私は2つだけ。これは、あまりにも正規表現せずに行うことができます

match = s.match(/\\"(.*)\\"/m) 
match[1] if match 
+0

たとえ1組の引用符だけを仮定していても(なぜ?)、その間に改行があれば動作しません(OPが要求した場合)。 – stema

+0

単に改行 '/ m'にマッチさせるだけです。答えを変更しました。 – iltempo

+0

'm'は複数行のスイッチで、'^'は行の先頭に一致し、' $ 'は行末になります。 's'を意味すると仮定して改行文字にマッチします。 – stema

0

文字列に二重引用符をエスケープがあると仮定しています:

$str = '\"Some text inside here. And perhaps special chars including newlines...\" then more text (out here)'; 

$out = explode('"', $str); 

echo $out[0]; // outputs "\" 
echo $out[1]; // outputs "Some text... ...\" 
echo $out[2]; // outputs " then...here)" 
1

はこれがするべきあなたのため正常に動作します:

b'\\".*?\\"' 
3

このパターンは使用できません。

あなたがフラグ「S」「ドット」を作るこれを使用しない限り、「ドット」は改行文字と一致していないので、
\".*\" 

、さらにこのパターンを(改行文字を含む)すべてを一致させます

"this is a quoted text" and "this is another one" 

上記のパターンは、引用符で囲まれた2つのテキストではなく、文字列全体と一致します。 (。*は欲張りで、できるだけ長い文字列(この場合は文字列全体)と一致するからです)。これはパターンを「気にしない」ものにし、できるだけ短い文字列に一致させる。あなたがフラグとともに、このパターンを使用することができ、それをラップする

「S」(ドット・全一致):

\".*?\" 

またはこれを使用する:

必要としない
\"[^"]\" 

"s"フラグ。 ([^「]は、改行が含まれているものと一致したが、」以来。)

(私はPHPの文法に慣れていないよ、あなたはフラグを適用し、文字を自分でエスケープの世話をする必要があります。)

+0

+1、それは良い説明と答え、2点:1.あなたがパターンでそれをエスケープする必要があるバックスラッシュと一致させる場合は、2.ネゲートされたcharクラスを使った例は、エスケープされていない引用符エスケープされたもの。代わりに '' \\ "。\" \\ "'のような 's'修飾子と一緒に遅延量子が使われます。 – stema

+0

@Sahand:しかし、複数行一致モードを有効にする方が簡単です。 (他の答えを参照してください) – alexis

+1

マルチラインフラグをオンにすると$と^がラインの開始と終了にマッチします。ドットマッチ改行を作成しません。 (私が言及したように、文法は言語間を守り、私はPHPに精通していないので、私は読者にエスケープなどを任せました) – Untitled

関連する問題