• ベストアンサー

正規表現でシングルクォーテーション内の文字列を取る

正規表現でどうしても分からない状態です。よろしくお願いします。 PHP5.2で、 'You\'re pen' というシングルクォーテーションで囲まれた文字列を 正規表現で取得しようとしています。 preg_match_all("/\'([^\']*|\\\')*?\'/", $src, $matches); のようにしていますが、どうしても 'You\' までしか取れません。 どうしたら取れるでしょうか。。m(_ _)m

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

preg_match_all("/'([^'\\\\]|\\\\\\\\|\\\\')*?'/",$src,$matches); まず、 " " で囲んだ文字列の中の ' はエスケープ不要です。 正規表現で、\ 自身を表すためには \\ とする必要がありますが、\\ を引用符で囲まれた文字列で表すためには、\\\\ と書きます。 同じように"で囲んだ正規表現で \\ という文字列を表すのは \\\\\\\\ となります。 上記は ' で以下のものを囲んだ文字列にマッチします。 (1) ' でも \ でも無い文字 (2) \\ で \ 自身を表す (3) \' で ' を表す

touchme
質問者

お礼

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

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

シングルクォーテーションで囲まれた'You\'re pen'のような文字列にマッチするというだけなら、 preg_match_all("/'(.*)'/", $src, $matches); preg_match_all("/'(.*?[^\\\\])?'/", $src, $matches); などの様なものが考えられますが、正確な条件が分からないと答えられないかと。 下記のことはどうなりますでしょうか? ・\が前に付いたシングルクウォートはどう扱うか? ・取得したい文字列は一つか複数か? ・入力文字列に制限は有るか? また、例えば、入力が「a\'b'c'd'e\'f'g\'h」でしたら、期待される結果はどうなりますか?

touchme
質問者

お礼

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