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

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

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

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

PHP

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

Q&A

解決済

2回答

4053閲覧

正規表現によるurl抽出・エンコードについて

seel

総合スコア25

URL

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

PHP

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

0グッド

0クリップ

投稿2016/07/02 12:11

編集2016/07/02 21:06

こんにちは。

file_get_contentsでファイル取得後
test1.php内のurlの特定部分以降をurlエンコードしたいのですが
どうやったらいいでしょうか。

http://exmple.com/a/b/c/ :以降を取得しurlencodeしたい。
http://exmple.com/a/b/c/ :以降は階層も文字列もランダムです。

test1.php

http://exmple.com/a/b/c/1/ ... http://exmple.com/a/b/c/2/ ... http://exmple.com/d/e/f/3/ ... http://exmple.com/d/e/f/4/ ... http://exmple.com/g/h/i/5/ ... http://exmple.com/g/h/i/6/ ... ...

やってみたこと

test2.php

$html = file_get_contents('test1.php'); $search = array('exmple.com'); $replace = array('EXMPLE.com'); echo str_replace($search,$replace,$subject);

これで全てのexmple.comをEXMPLE.comに置換することまではできたのですが
目的は部分以降のランダムなものに対してだけエンコード置換することなので
まず http://exmple.com/a/b/c/ でマッチさせて
http://exmple.com/a/b/c/ 部分以降をサーチしてurlエンコードできればokです。

やってみたこと その2

test3.php

$html = file_get_contents('test1.php'); $subject = $html; $url = 'http\:\/\/exmple\.com\/a\/b\/c'; $search = array('http\:\/\/exmple\.com\/a\/b\/c'); $replace = array(urlencode($url)); echo str_replace($search,$replace,$subject);

これで
http://exmple.com/a/b/c部分だけ全てurlencodeできました。

でもやりたいことはhttp://exmple.com/a/b/c/ランダム・・・
のランダム・・・部分だけのurlエンコードですが

もしくはhttp://exmple.com/a/b/c/以降ランダム全体でもかまいません。
(もしかするとそのほうが簡単でいいのかもしれません)

http://exmple.com/a/b/c/以降ランダム全体のurlencodeの場合は

$url = 'http://exmple.com/a/b/c/[以降urlが終わるまで]';
という正規表現が欲しいところですが

http://exmple.com/a/b/c/$1としてみても
http://exmple.com/a/b/c/.*/としてみてもできませんでした。

$url = 'http://exmple.com/a/b/c/[以降urlが終わるまで]';の

preg_replace_callbackも一応は試してはみたのですが今の僕の力では
うまく理解できませんでした。

[以降urlが終わるまで]という正規表現はどう書いたらいいのでしょうか?
わかる方、どうか教えてください。

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

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

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

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

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

guest

回答2

0

ベストアンサー

urlの終わりをどこだと判断するかによりますが
こんな感じでは?

PHP

1<?PHP 2$content=<<<eof 3http://exmple.com/a/b/c/1/... 4http://exmple.com/a/b/c/2/?x=1... 5http://exmple.com/a/b/c/2/?y=2&z=3... 6... 7http://exmple.com/d/e/f/3/... 8http://exmple.com/d/e/f/4/... 9eof; 10$pattern="|(http://exmple.com/a/b/c/)([a-zA-Z0-9&\?\=\+\/\*\-]*)|"; 11if(preg_match_all($pattern,$content,$matches,PREG_SET_ORDER)){ 12 foreach($matches as $key=>$match){ 13 $content=str_replace($match[0],$match[1]."?text=".urlencode($match[2]),$content); 14 } 15} 16print $content; 17?>

追記

preg_replace_callback()だとこんな感じ?

PHP

1$pattern="|(http://exmple.com/a/b/c/)([a-zA-Z0-9&\?\=\+\/\*\-]*)|"; 2$replacement=function($a){return $a[1].urlencode($a[2]);}; 3$content=preg_replace_callback($pattern,$replacement,$content); 4

投稿2016/07/03 08:01

編集2016/07/04 01:28
yambejp

総合スコア114572

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

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

seel

2016/07/05 21:17

ありがとうございます。 追記のpreg_replace_callback()はさっそく試してみます。 上のほうでいうとhttp://exmple.com/a/b/c/以降全てとなっていて 今すぐ確認できませんがたぶんaタグ終わりで区切られていると思います。
seel

2016/07/15 01:56

こうしてみました。 $html = file_get_contents('test.php'); $pattern="http://exmple.com/a/b/c/"; $search = array('http://exmple.com/a/b/c/'); $replace = array(urlencode($pattern)); echo str_replace($search,$replace,$html); 結果  test.php内全てのhttp://exmple.com/a/b/c/が http%3A%2F%2Fexmple.com%2Fa%2Fb%2Fc%2F に変換されましたが、/a/b/c/部分がランダムなurlですので $pattern="http://exmple.com/正規表現"; $search = array('http://exmple.com/正規表現'); としたいです。試しに $pattern="https?://[\w/:%#\$&\?\(\)~\.=\+\-]+"; $search = array('https?://[\w/:%#\$&\?\(\)~\.=\+\-]+'); としてみたらエンコードされませんでした。 それはどのような正規表現になるのか教えてください。 http://exmple.com/正規表現 ぼくのわかる範囲で描くとこんな感じです http://exmple.com\/.*\/ http://exmple.com/ここから(階層もバラバラです)ここまで"> です。
guest

0

.*$と書きます。

(http:\/\/exmple\.com\/a\/b\/c\/)(.*)$ として、$1 で前半部分が、$2 で後半部分が取り出せます。

pret_replace でなく preg_match を使って、preg_match($pattern, $subject, $matches) とすると $matches[1] に前半部分、$matches[2] に後半部分が入るので、後半部分をエンコードして前半部分に接続するというのが簡単かもしれません。

投稿2016/07/02 12:14

編集2016/07/02 12:27
Zuishin

総合スコア28656

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

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

seel

2016/07/02 23:35 編集

下記のように書いてみたのですがうまくできませんでした。 $html = file_get_contents('test1.php'); $subject = $html; $url = '(http\:\/\/exmple\.com\/a\/b\/c\/(.*)$'; $search = array($url); $replace = array(rawurlencode($url[2])); //$以降のはず?! echo star_replace($search,$replace,$subject); 補足です。 test1.php : url...id=[url]←encode部分という形になっています。
Zuishin

2016/07/02 23:32

preg_match どこ行きました?
seel

2016/07/06 11:24

preg_matchは試したらうまくいかず頭がこんがらがってしまいました。 僕の力不足だと思います、すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問