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

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

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

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

正規表現

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

Q&A

解決済

2回答

1302閲覧

[正規表現]URLからある部分まで取得したい

entaro12345

総合スコア75

URL

URL(ユニフォームリソースロケータ)とは、インターネット上のリソース(Webページや電子メールの宛先等)を特定するための形式的な記号の並びの事を言う。

PHP

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

正規表現

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

0グッド

0クリップ

投稿2020/03/20 01:13

編集2020/03/20 01:36

前提・実現したいこと

PHPで正規表現を使用してURLからある部分までを取得したいです。
正規表現の知識が薄く、時間的に勉強している時間がないため、質問させていただきました。

●URL
https://aaaaa.com/abcde/xyz.php?aaa=12345

上記URLから
https://aaaaa.com/abcde」までを取得したいのです。
https://aaaaa.com」までなら調べて取得できたのですが、その先がわからないです。

・aaaaa.comやabcdeは可変になります。

すみませんが、お力添え宜しくお願いします。

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

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

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

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

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

kyoya0819

2020/03/20 01:20

aaaaa.comは不変ですか? abcdeは不変ですか? それとも何かしらの法則性があるなら質問に御追記ください。
m.ts10806

2020/03/20 01:23

asuchi0819さんのおっしゃることはもっともですね。 要件やパターンが1つしかないので「時間ないから答えろ」と言われても 今私がした回答でどこまで満たせるか分からないので答えづらい状況です。
entaro12345

2020/03/20 01:36

失礼いたしました。 aaaaa.comもabcdeも可変になります。 そのため、正規表現での取得が良いのかなと思っております。 質問文にも追記します。
m.ts10806

2020/03/20 01:37

その後、私の回答を試してみて満たせない部分あったらそれも追記してください。
m.ts10806

2020/03/20 01:40

>・aaaaa.comやabcdeは可変になります。 これだけだとほぼヒントなしですよ。 「どのようなパターンがあるのか」洗い出してください。 可変って言葉は本当に如何様にもとれるので。 単にURLというだけなら私が回答で提示したpathinfo()で満たせます。 正規表現は万能ではないですよ。パターンすべて洗い出しての対応が必要なので可変のパターン次第ですけど、可変にはあまり強くない仕組みです
entaro12345

2020/03/20 01:41

ありがとうございます。 提示していただいたpathinfo()で試みてみます。
Orlofsky

2020/03/20 02:14

なんでもかんでも正規表現を使いたがる人がいるけど、 https:// 以降に見つかった2つ目の / から 右側 で良いような?
guest

回答2

0

ベストアンサー

別解

php

1<?php 2 3$url = 'https://aaaaa.com/abcde/xyz.php?aaa=12345'; 4 5 6echo PHP_EOL.'-----'.PHP_EOL; 7 8$components = explode('/', $url); 9echo implode('/', array_slice($components, 0, count($components)-1)); 10 11echo PHP_EOL.'-----'.PHP_EOL; 12 13echo substr(explode(pathinfo($url)['filename'], $url)[0], 0, -1); 14 15echo PHP_EOL.'-----'.PHP_EOL; 16 17echo str_replace('/'.pathinfo($url)['basename'], '', $url); 18 19echo PHP_EOL.'-----'.PHP_EOL; 20 21echo substr($url, 0, -1 * (1 + strlen(pathinfo($url)['basename']))); 22 23echo PHP_EOL.'-----'.PHP_EOL;

投稿2020/03/20 02:41

thyda.eiqau

総合スコア2982

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

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

thyda.eiqau

2020/03/20 02:52

正規化されていないものに正規表現を使うのは得策ではありません。たとえばなにかのログを見るときは、[発生日時] [脅威度] [エラーコード] [概要] のように決まった形式で記録されているはずなので正規化されていると言えます。 URLの場合、そのシステムに入ってくるURLのフォーマットが決まっている(ドメインが固定でフォルダの数も固定だがフォルダ名・ファイル名が違う可能性があるとか、ドメインは可変だがサブフォルダはつかないとか、言語化できるなんらかのルールがある)のであれば正規化されていると言ってもいいですが、ドメインのレベルは何個あるかわからない、フォルダの階層もわからない、クエリの長さもわからないだと、正規表現を使うのはやめたほうがいいです。できなくはないと思いますが、書くのも大変だしメンテナンス性は悪いし苦痛なだけです。 もしあなたが直面しているのが「正規表現を使ってみよう」という課題なのであれば、あなたが考えないと意味がないので、がんばって正規表現を書いてください。先述の通り、フォーマットが決まっているなら正規表現で表すことができます。
thyda.eiqau

2020/03/20 03:05

ちなみに私の回答の中だとオススメは1つ目か4つ目です。「いくらでもやりようはある」ことを示すために、思いつくままに4パターン書きましたが、2つ目と3つ目には条件次第で崩壊する可能性があります。 1つ目と4つ目に崩壊の可能性は無いと断言できるわけではない (悪魔の証明) ですが、2つ目と3つ目は容易に崩壊パターンが思いつくという感じです。どういうURLが来ると崩壊するか考えてみても面白いと思います。 「自分で壊そうとしてみる」のは、壊れないシステムを作るための重要な考え方です。何をしたら壊れる (= 意図しない動きになる) だろう?と考えるようにしてください。 質問に追記・修正依頼が来ましたよね。それは、ベテランになればなるほど「あれが来たら壊れる」「これが来たら壊れる」と思いつくパターンがたくさん思いつくので、せめて「あれは来ない」「でもここは考慮する必要がある」というようになるべく曖昧な部分を排除したいからです。たくさんのパターンをすべて回答に書くのは大変なので。
m.ts10806

2020/03/20 03:17

コメントの方がアドバイスとしては重要ですね。
guest

0

正規表現である必要はないように思います。

php

1$url = "https://aaaaa.com/abcde/xyz.php?aaa=12345"; 2var_dump(pathinfo($url)); 3/** 4array(4) { 5 ["dirname"]=> 6 string(23) "https://aaaaa.com/abcde" 7 ["basename"]=> 8 string(17) "xyz.php?aaa=12345" 9 ["extension"]=> 10 string(13) "php?aaa=12345" 11 ["filename"]=> 12 string(3) "xyz" 13} 14**/

パターンが1つしか提示されてないのでこれで満たせない場合は要件をすべて洗い出して提示してください。知っていることが自身にしかないのでしたら的確なアドバイスは得られません。
後出しが一番よろしくありません。(要件次第では私は今後この回答に追記しません)

苦言になってしまいますが。

正規表現の知識が薄く、時間的に勉強している時間がないため、質問させていただきました。

質問している時間で解決する内容だとしたら
勉強している時間はあるのでは?

言い訳よりも「やったこと」「試したこと」をどんなに途中なものでも不細工でも書いてもらった方が解決に繋がりやすくなりますし、何より丸投げ感がなくなります。

投稿2020/03/20 01:18

編集2020/03/20 01:25
m.ts10806

総合スコア80875

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

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

entaro12345

2020/03/20 01:40

アドバイス等ありがとうございます。 おっしゃる通りですね。 情報もすべて出してない状況でご質問してしまい、大変申し訳なく思っております。
m.ts10806

2020/03/20 01:44

ちなみに https://aaaaa.com/abcde/fghij/https://aaaaa.com/abcde/ が欲しいとなった場合、 pathinfoだけでは無理ですが、そもそもそうなると正規表現としても簡単ではないので、pathinfo()とった上で/でばらして1つ目を取得するなど工夫することで取得可能です。 やはり要件次第ですね。ただ、なんでもかんでも「1回で取る」と考えなくて良いですし、わざわざ苦手な正規表現に挑戦する必要はないと思います。 結局自分で考えることができないのでしたら毎回誰かに頼ることになって、何か仕様変更したときに自分では手に負えないものになりますからね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問