###前提・実現したいこと
正規表現で、URL中からパラメータだけ抜き出すものを教えてください。
http://www.example.jp/?OVKEY=車&OVRAW=練馬&OVMTC=Broad
というURLがあったとしたら、「車」「練馬」「Broad」
を抜き出したいです。
※PHPのpreg_matchで機能するものでおねがいします
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
正規表現を使わなくても専用の関数があります。
【PHP: parse_url - Manual】
http://php.net/manual/ja/function.parse-url.php
【【PHP】URLを分解して配列で取り出すには? | Web.fla】
http://the-zombis.sakura.ne.jp/wp/blog/2015/01/23/post-2561/
投稿2017/08/19 08:06
総合スコア69407
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/19 08:15
2017/08/19 08:18
2017/08/19 08:26
2017/08/21 01:38
2017/08/21 02:48
0
正規表現でできなくもないですが、正規表現だけでは取れません。
なぜなら、正しい URL であるならば、マルチバイト文字をパラメータとして送っては来ないからです。% エスケープされて送られてきます。
ですから正規表現で取り出した後に、% エスケープをもとに戻す処理も必要になります。その際には URL を送ってきた側がどのエンコーディングを使っていたかによって変わってきますから、本質的には URL 単独では、正しく逆返還することができません。
※URLそのものには文字エンコーディングの情報がないのですから
それらを考慮すれば、すでにある解析関数を使ったほうが手間暇かからないですよ。
投稿2017/08/21 01:27
総合スコア13703
0
RFC3986
URIのパースは奥が深いもので、正規表現でパースは厳密さを求めると困難です。
過去に RFC3986 準拠でパースしたコードをかぎましたが、完成するまで2~4週間はかかったように思います。
英文の解読に時間を費やしましたが、実は日本語訳があったので、今書こうと思えばもう少し短時間でかけるかも知れません。
https://gist.github.com/think49/770087
https://triple-underscore.github.io/RFC3986-ja.html
URL Standard
時代は移り変わり、RFCで定義されていた URI は WHATWG によって URL Standard として再定義されました。
この仕様は URL のパース処理も規定されているので、URLパーサを作る際にはとても役立ちます。
https://triple-underscore.github.io/URL-ja.html
https://url.spec.whatwg.org
パースする為の正規表現 (簡易版)
ここで述べる正規表現は厳密さはなく、私の知識範囲で簡易的に構成したものです。
より厳密さを求める場合は前述の URL Standard を参照して下さい。
まず、URLハッシュを取り除きます。
この正規表現にマッチした文字列を削除する事で http://example.com/#?foo=1&bar=2
のようなクエリ文字列ではないURLハッシュ値にマッチしてしまう問題を回避します。
本来、不正なURLですが、ブラウザは http://example.com/#foo#bar
において #foo#bar
をURLハッシュとして扱う為、始めにマッチした # 以降をURLハッシュと見做します。
PHP
1'/#.*$/'
次にクエリ文字列にマッチさせます。
前述の処理でURLハッシュが存在しない事が確定しているので安心して終端までマッチできます。
本来、不正なURLですが、http://example.com/?foo=1&bar=2?&piyo=3
が与えられれば、?foo=1&bar=2?&piyo=3
をクエリ文字列と見做します。
PHP
1'/?.*$/'
次にパラメータを分解します。
PHP
1'/[?&]([^&]+)/'
次にパラメータを「名前」と「値」に分解します。
foo==1=
のような不正なパラメータにも対応させます。
PHP
1'/([^=]+)=(.*)/'
最後に「名前」と「値」をパーセントデコード(旧称: URLデコード)します。
正規表現系統以外の標準関数が使えないということなので、chr()
を使いたいところですが、仕方がないので「ASCII値 <-> 文字」の変換マップを自前で用意して変換していきます。
PHP
1'/(?:%[\dA-Fa-f]{2})+|\+/'
chr()
を使って機械的にマップを生成すれば良さそうです。
Re: bakaemon さん
投稿2017/08/21 08:14
編集2017/08/21 14:13総合スコア18164
0
ベストアンサー
GETのnameが変わらないのであれば
php
1$ptn = '/OVKEY=(.*)&OVRAW=(.*)&OVMTC=(.*)$/'; 2$text = 'http://www.example.jp/?OVKEY=車&OVRAW=練馬&OVMTC=Broad'; 3preg_match( $ptn, $text, $matches );
で良いかと。
投稿2017/08/19 08:44
総合スコア111
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/21 01:38
2017/08/21 02:51
2017/08/21 03:57
2017/08/21 14:36
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。