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

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

ただいまの
回答率

90.47%

  • PHP

    24519questions

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

  • URL

    239questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,642

seel

score 17

こんにちは。

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が終わるまで]という正規表現はどう書いたらいいのでしょうか?
わかる方、どうか教えてください。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

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

 追記

preg_replace_callback()だとこんな感じ?

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/06 06:17

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

    キャンセル

  • 2016/07/15 10:56

    こうしてみました。
    $html = file_get_contents('test.php');
    $pattern="http://exmple.com/a/b/c/&quot;;
    $search = array('http://exmple.com/a/b/c/&#039;);
    $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/ここから(階層もバラバラです)ここまで"> です。

    キャンセル

  • 2016/07/15 12:01

    http://exmple.com/」以下をすべてurlencodeしてよいならこんな感じ?

    <?PHP
    $content="http://exmple.com/正規表現";
    $pattern="|(http://exmple.com/)(.*$)|";
    $replacement=function($a){return $a[1].urlencode($a[2]);};
    $content=preg_replace_callback($pattern,$replacement,$content);
    print $content;
    ?>

    キャンセル

0

.*$と書きます。

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/03 08:26 編集

    下記のように書いてみたのですがうまくできませんでした。

    $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部分という形になっています。

    キャンセル

  • 2016/07/03 08:32

    preg_match どこ行きました?

    キャンセル

  • 2016/07/06 20:24

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • PHP

    24519questions

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

  • URL

    239questions

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