• 締切済み

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

現在、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"; }

  • PHP
  • 回答数2
  • ありがとう数2

みんなの回答

  • 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

  • 正規表現について

    PHP5.2.4を使用しています。 1文字以上のアルファベットと数字の組み合わせは許可(含めて) かつ 「ab」は許可しない(含めない) という正規表現はどのように記述すれば良いのでしょうか?(「01ab」「abc」は許可、「ab」は許可しない) 一応自分なりに考えてみたのですが、 $str = "abc"; if (preg_match("/[^(ab)][a-z0-9]+/", $str)) { print "match<br>\n"; } やはり駄目でした・・・

    • ベストアンサー
    • PHP
  • http://とhttps://のどちらでもマッチングできる正規表現

    http://とhttps://のどちらでもマッチングできる正規表現の書き方が分かりません。aタグの中のhref="のあとのURL部分にhttpでもhttpsのどちらでもOKのマッチングをかけたいです。 具体的にはhttp://www.aaa.co.jpでもhttps://www.aaa.co.jpのどちらでもpreg_match_allでマッチングをかけたいです。 $count=preg_match_all("正規表現",$URL,$maches); という感じでhttpかhttpsのURLに引っ掛けたいです。 教えてください

    • ベストアンサー
    • PHP
  • 正規表現のコーディングについてお願いします。

    こんにちは、よろしくお願いいたします。 正規表現パターンを書く場合に皆さんがどのようにされているか教えてください。 例えば(ちょっとムリヤリ感が強いですが)、'Price \5800-' という文字列の \5800 の部分に preg_match でマッチさせたいとします。 単純に考えると、 /\\\d+/ のようなパターンが思いつくのですが、それを文字列として preg_match に渡す際に、コードはどのように書かれますか? <?php   $str = 'Price \5800-';   //とりあえず、'/\\\d+/' と書き、'/\\\\\\d+/' と、\ をそれぞれの \ に書き足す   if ( preg_match('/\\\\\\d+/', $str, $match) ) {     print_r($match);   } ?> 「まず、パターンを書き、全ての \ の前に \ を書き足す。」というのが無難なのかな?と思い、そうしていますが、 そういった考え方で間違っていないでしょうか? どうぞよろしくお願いいたします。

    • 締切済み
    • PHP
  • 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

    質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。

    • ベストアンサー
    • PHP
  • カンマ区切りの金額を検索するための、正規表現を教えてください

    PHP4を使っています。 表題のとおりなのですが、 カンマ区切りの金額を検索するための、正規表現を教えていただけないでしょうか? http://oraclesqlpuzzle.hp.infoseek.co.jp/regex/regex-3-14.html を参考に、 $pattern = '^(0|([1-9][0-9]{0,2}(,[0-9]{3}){0,2}))$'; if (preg_match("/$pattern/", $oneline_buffer, $matches)){ としているのですが、 なぜかpreg_matchにひっかかりません。 (preg_match の直前の行を通っていることは、確認済みです) どなたか、お助け願えれば幸いです。

    • ベストアンサー
    • PHP
  • PHPの正規表現について

    // URLエンコード $str =~ s/([^\w ])/'%' . unpack('H2', $1)/eg; $str =~ tr/ /+/; これをPHPの関数を使った方法と使わなかった方法が知りたいです。 また、正規表現で、ereg.., preg.., mb_eregがありますが、この違いの詳細が知りたいです。

    • ベストアンサー
    • PHP
  • 正規表現での最後尾のバックスラッシュの扱いについて

    使用しているSQLテーブルで、フィールド名siteurlに格納しているURLの最後尾にスラッシュがついているものとついていないものがあるので、つけるように統一しようと思います。 PHPを書き、実行したところ、次のようなエラーが出てきました。 Warning: preg_match() [function.preg-match]: No ending delimiter '/' found in C:\xampp\htdocs\sql_open.php on line 42 この部分のコードは次の通りです。 if(!preg_match("\/$",$row["siteurl"])){ //行末がスラッシュでないならスラッシュを追加する $row["siteurl"].="/"; } エラーの内容を考えて、コードを以下のように修正したところ、 if(!preg_match("\/$",$row["siteurl"])){ //行末がスラッシュでないならスラッシュを追加する $row["siteurl"].="/"; } というエラーが出てきます。 preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash in C:\xampp\htdocs\sql_open.php on line 42 正規表現はあまり得意ではなく、どこかしら間違いがあったのかもしれませんが自分ではわかりません。 この問題の解決方法をご教示ください。どなたかご教示のほど、どうかよろしくお願いします。

    • ベストアンサー
    • PHP
  • 正規表現について

    PHPにおける正規表現についての質問なのですが、 preg_match('#^/user/(?P<id>[^/]+)$#', $string) 第一引数の正規表現がいまいち理解できません。 ご教授のほど宜しく御願いします。

    • 締切済み
    • PHP
  • 正規表現について

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現での改行数を求めるにあたって

    以下の文字列がフォームからPOSTされたとします。 ------------------- 1 2 3 4 5 ------------------- ポストされた文字列が$strに格納されているとして、 以下を実行しました。 ------------------- print preg_match_all("[\n\r]", $str, $dummy); print preg_match_all("[\r\n]", $str, $dummy); print preg_match_all("[\r]", $str, $dummy); print preg_match_all("[\n]", $str, $dummy); ------------------- 結果はこうなりました。 ------------------- 6 6 10 10 ------------------- どうやらマッチパターンが"[\n\r]"と"[\r\n]"の場合は空白行の数を、 "[\r]"と"[\n]"の場合は純粋に改行数を返しているようです。 どうしてこのような差が出るのでしょうか? 文字コードはEUC、改行コードはLFで統一していますが関係ありますか?

    • 締切済み
    • PHP

専門家に質問してみよう