質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

1665閲覧

phpのpreg_matchで正規表現

move

総合スコア16

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/11/29 16:28

編集2016/11/30 01:55

例えば下記のようなURLがあったとします。

http://samples.com/hoge/param1/param2/param3/param4/....../paramN http://samples.com/hoge/param1/param2/param3/param4/....../paramN/ http://samples.com/hoge/param1/param2/param3/param4/....../paramN?getparam1=1&getparam2=2

上記のパス

$path = /hoge/param1/param2/param3/param4/....../paramN $path = /hoge/param1/param2/param3/param4/....../paramN/ $path = /hoge/param1/param2/param3/param4/....../paramN?getparam1=1&getparam2=2

からpreg_match使ってparam1,param2,...,paramN(可変長)
を取得したい。

preg_match($path,$regex,$values);

下記のように取得したい

$values = array(param1,param2,param3,param4,....,paramN);

preg_match以外の方法であれば容易にできるが、事情がありpreg_matchで取得したいのですが、このような正規表現をできる$regexはどのように記述すれば良いでしょうか?

###追記

目的としてはこれはリクエストを振り分けるのルーティング部分の処理になります。
/hogeから始まる場合それ以降の単語をパラメータとして扱いたいため、
正規表現で/hogeから始まる場合それ以降のpara1〜paraN(可変)を取得したい
です。
現状ルーティング部を処理するクラスが、何種類かあり今回のような構造の場合処理するクラスは正規表現を使って解析をするルータークラスが一番近かったので、できればそれを使用したい。
ただしその内部でつかっているのはpreg_matchであるため、preg_matchしか使えないという意味で「事情があり」とさせていただいておりました。

もしpreg_matchでは不可能な場合、別途独自にそのルーティングクラスの派生クラスを作らないといけないのでがそれはできれば避けたい為質問させて頂きました。

質問ではpara1などpara+数字の形式が固定かのように見えますが、これも説明不足でした、URLに使用可能な文字でお願い致します。

追記:
既存のクラスにパラメータとして正規表現のパターンを渡すと内部でpreg_matchで解析するというクラスの為、派生クラスをつくらず既存クラスを使う場合、こちらが触れるのは正規表現パターンのみです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kunai

2016/11/30 02:25

普通に考えたら、実装方法はどのような形であれやりたいように動けばいい気がしますが、preg_matchにこだわられる理由はなんですか?課題ですか?
move

2016/11/30 02:34

preg_match縛りな理由ははすでに質問に追記させていただいている通りなのですが、既存のクラスの内部処理がpreg_matchの為、できれば既存クラスを使えないかな?という理由からです。派生クラスを作り処理すれば可能ではあるのですが、できれば既存クラスを使用したいと思い質問させていただいております。課題ではありません(学生ではなくすでにいい年のおっさんなので。。。)
guest

回答2

0

ベストアンサー

先頭から4個目のスラッシュまでとケツのスラッシュまたは?以降の文字を削除して
スラッシュで分割します

PHP

1$pattern="#^((.*?/){4})|(\?.+|/)$#"; 2$str="http://samples.com/hoge/param1/param2/param3/param4/....../paramN?getparam1=1&getparam2=2"; 3$values=explode("/",preg_replace($pattern,'',$str)); 4print_r($values); 5 6

投稿2016/11/30 01:09

yambejp

総合スコア114814

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

move

2016/11/30 01:50 編集

ありがとうございます。事情があり、preg_matchを使用してなんとかならないかと思い質問させていただきました。少し質問追記しました。preg_matchを使って可変文字列取得は難しいでしょうか?
yambejp

2016/11/30 02:55

>preg_matchを使って可変文字列取得は難しい 難しいというより理論上不可能では? 複数のカッコを使った場合0番目の要素はマッチした文字列全体になるので 一発でご指定の$valuesの形で受けることはできないですね
move

2016/11/30 03:32

ありがとうございます、フレームワーク付属のルータークラスがそのような実装だったので、できればと思い質問させていただいておりました。 > 難しいというより理論上不可能では? ありがとうございます。明確に不可能という回答が派生クラスを作って独自ルーテインクグクラスを作る踏ん切りがつきました、ありがとうございます。
guest

0

php

1<?php 2 3$url1 = "http://samples.com/hoge/param1/param2/param3/param4/paramN"; 4 5$res1 = parse_url($url1); 6$arr = explode('/', $res1['path']); 7var_dump($arr);

php

1<?php 2 3$url1 = "http://samples.com/hoge/param1/param2/param3/param4/paramN"; 4$pu = parse_url($url1); 5$path = $pu['path']; 6 7preg_match_all("/(\/\w+\d)/", $path, $matches); 8var_dump($matches[0]); 9

php

1<?php 2 3$url1 = "http://samples.com/hoge/param1/param2/param3/param4/paramN"; 4$pu = parse_url($url1); 5$path = $pu['path']; 6 7preg_match_all("/(\/(\w+\d))/", $path, $matches); 8var_dump($matches[2]); 9

投稿2016/11/29 16:35

編集2016/11/29 17:13
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

move

2016/11/30 01:49

いつもありがとうございます。少し説明に不足があったようですので追記させて頂きました。可変の場合preg_math_allではなくpreg_matchでは無理なのでしょうか?
退会済みユーザー

退会済みユーザー

2016/11/30 03:10

そもそもですが、自分で正規表現を書くことができない場合、自分はそのアプローチを変えます。つまり正規表現による実装はしないということです。正規表現パターンをかけないということは、自分でメンテナンスできないということですから。
move

2016/11/30 03:30

ありがとうございます、フレームワーク付属のルータークラスがそのような実装だったので、できればと思い質問させていただいておりましたが、派生クラスをつくり内部preg_math_allの方向で検討します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問