プロが教える店舗&オフィスのセキュリティ対策術

正規表現でどうしても分からない状態です。よろしくお願いします。

PHP5.2で、

'You\'re pen'

というシングルクォーテーションで囲まれた文字列を
正規表現で取得しようとしています。

preg_match_all("/\'([^\']*|\\\')*?\'/", $src, $matches);

のようにしていますが、どうしても

'You\'

までしか取れません。
どうしたら取れるでしょうか。。m(_ _)m

A 回答 (2件)

preg_match_all("/'([^'\\\\]|\\\\\\\\|\\\\')*?'/",$src,$matches);



まず、 " " で囲んだ文字列の中の ' はエスケープ不要です。
正規表現で、\ 自身を表すためには \\ とする必要がありますが、\\ を引用符で囲まれた文字列で表すためには、\\\\ と書きます。
同じように"で囲んだ正規表現で \\ という文字列を表すのは \\\\\\\\ となります。

上記は ' で以下のものを囲んだ文字列にマッチします。
(1) ' でも \ でも無い文字
(2) \\ で \ 自身を表す
(3) \' で ' を表す
    • good
    • 0
この回答へのお礼

分かり易くご説明いただきましてありがとうございます。
¥マークの羅列に一瞬びっくりしましたが、
そのような規則があるとは知りませんでした。
大変参考になりました。ありがとうございますm(_ _)m

お礼日時:2009/04/13 10:02

シングルクォーテーションで囲まれた'You\'re pen'のような文字列にマッチするというだけなら、


preg_match_all("/'(.*)'/", $src, $matches);
preg_match_all("/'(.*?[^\\\\])?'/", $src, $matches);
などの様なものが考えられますが、正確な条件が分からないと答えられないかと。

下記のことはどうなりますでしょうか?
・\が前に付いたシングルクウォートはどう扱うか?
・取得したい文字列は一つか複数か?
・入力文字列に制限は有るか?

また、例えば、入力が「a\'b'c'd'e\'f'g\'h」でしたら、期待される結果はどうなりますか?
    • good
    • 0
この回答へのお礼

お礼遅くなり申し訳ありません。
ご回答いただきましてありがとうございます。
条件があいまいで大変お手数をおかけしてしまいました。
やりたいことは、PHPソース中のシングルクォートまたはダブルクォートで挟まれた文字列部分を全て抜き出すということでして、それは
$str = '123';
の'123'ようなものから、
$ary['abc']
の'abc'まで含みます。
ですので、a\'b'c'd'e\'f'g\'hといったケースは起こりえないという
ことになります。
初歩の初歩でつまずいておりましたので、まずは単純なご質問をさせていただきました。もし何かまたご意見いただけそうでしたらよろしくお願いしますm(_ _)m

お礼日時:2009/04/13 10:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!