• 締切済み

正規表現の\\が認識されない?

現在、PHPで正規表現を用いてURLをホスト名・パス名・クエリー部分を分けて出力するPGを作成しているのですが。 どうやら、'\\'が'\'(バックスラッシュ)として表現できていないようなのですが? なぜでしょうか? ご教授お願いいたします。 【PG】 $regexが正規表現内容 ↓ $regex = '/^(?:https?|ftp):\/\/([-.!~*\'()\w;:\@&=+\$,%#]+)\/?([-.!~*\'()\w;\/:\@&=+\$,%#]*)\??([\\-.!~*\'()\w;\/:\@&=+\$,%#]*)$/'; if( preg_match($regex, $str, $match) ) { echo $match[1]."\t".$match[2]."\t\n"; } else { echo "URLではありません。\n"; }

みんなの回答

  • a0205s
  • ベストアンサー率100% (4/4)
回答No.2

正規表現として問題があるのでしょうか? マッチさせようとしているURL($str)はどの様な値になっているのか気になります。 ローカルで試してみたところ、 このサイトのURLは正常にパースできました。 また、URLのパースをするならparse_urlと言う関数があるのでよかったらご覧ください。

idaira
質問者

お礼

自己解決しました。礼の欄で失礼いたします。 問題点は2つありました。 1点目は変数に正規表現を渡しているところで、'\\'は'\'と変換されしまうことです。 なので、変数に入れるなら'\\\'で渡さなくてはいけません。 2点目は'\\'のあとの'-'は[]内部では何かの文字と文字ではさまれると文字の範囲を表します。([a-z]のときはaからzの文字すべてをあらわす) 以上の点を踏まえて正規表現は下のようにするとうまくいきます。 $regex = '/^(?:https?|ftp):\/\/([-\\\.!~*\\\'()\w;:\@&=+\$,%#]+)\/?([-\\\.!~*\\\'()\w;\/:\@&=+\$,%#]*)\??([-\\\.!~*\\\'()\w;\/:\@&=+\$,%#]*)$/';

idaira
質問者

補足

たとえば、下のようなURLの場合です。 http://www.google.co.jp/search?client=firefoxa& rls=org.mozilla%3Aja%3Aofficial&channel=s&hl=ja &q=%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%80%80\W &lr=&btnG=Google+%E6%A4%9C%E7%B4%A2 *OKWaveでは長いURLは省略して表示されていしまうので 改行してあります。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

シングルコーテーションでくくっているなら、¥はいらないのでは? シングルコーテーション内でシングルコーテーションをエスケープする ときはつかいますけど・・・

関連するQ&A