PHPに関する質問です。

あるURL中に出てくる、ある文字列以降の文字列を抽出したいと思っています。
例:http://www.xxx.com/yyy/aaa/id=01234567/
この場合、①id=以降の文字列01234567を、②最後の/は抜かして抽出したいのですが、どのようにすれば良いのでしょうか。

回答の条件
  • 1人3回まで
  • 13歳以上
  • 登録:2010/12/23 19:49:54
  • 終了:2010/12/24 13:19:11

ベストアンサー

id:HowAreYou No.2

HowAreYou回答回数91ベストアンサー獲得回数172010/12/23 20:51:52

ポイント28pt

適当に思いついたもの数例

<?php

$url = 'http://www.xxx.com/yyy/aaa/id=01234567/' ;

// 正規表現 1
$word = preg_replace('/.*?id=(.*)\/$/', '$1', $url) ;

// 正規表現 2
preg_match('/id=(.*?)\//', $url, $m) ;
$word = $m[1] ;

// 「=」で分離
$m = explode('=', basename($url)) ;
$word = $m[1] ;
id:naoeco

ありがとうございます。

なるほど!正規表現だと、すっきりするのでマスターすればこちらのほうが、よりスマートな書き方ができそうですね〜

2010/12/23 20:59:35

その他の回答(3件)

id:doumoto No.1

どうもと回答回数497ベストアンサー獲得回数372010/12/23 20:29:02

ポイント28pt

$file = "http://www.xxx.com/yyy/aaa/id=01234567/";

$pos1 = strlen($file);

$pos2 = strpos($file, "id=");

$link_str = substr($file,$pos2,($pos1 - $pos2 - 1));

echo $pos1;

echo $pos2;

echo $link_str;

?>

$idのスタート位置を探して、そこからid=01234567の長さ分の文字列を抜いてあげればよいかと。(´ー`)y-~~。

id:naoeco

なるほど!と思いました。こういう方法もあるのですね〜

これなら、無理に正規表現を使う必要もなさそうです。ありがとうございました。

(なお、先ほど私なりに思いついた方法としては、

strrchr関数でまずid=以降の文字列(/、id=も含む)を取り出し、str_replaceで地道に/とid=を削っていくというものでした。)

2010/12/23 20:33:14
id:HowAreYou No.2

HowAreYou回答回数91ベストアンサー獲得回数172010/12/23 20:51:52ここでベストアンサー

ポイント28pt

適当に思いついたもの数例

<?php

$url = 'http://www.xxx.com/yyy/aaa/id=01234567/' ;

// 正規表現 1
$word = preg_replace('/.*?id=(.*)\/$/', '$1', $url) ;

// 正規表現 2
preg_match('/id=(.*?)\//', $url, $m) ;
$word = $m[1] ;

// 「=」で分離
$m = explode('=', basename($url)) ;
$word = $m[1] ;
id:naoeco

ありがとうございます。

なるほど!正規表現だと、すっきりするのでマスターすればこちらのほうが、よりスマートな書き方ができそうですね〜

2010/12/23 20:59:35
id:phithon No.3

phithon回答回数5ベストアンサー獲得回数12010/12/23 21:28:06

ポイント17pt

微妙に内容が被ってしまいましたが・・・

<?php
$url = 'http://www.xxx.com/yyy/aaa/id=01234567/';
$parts = explode('/', $url); // ['http:', '', 'www.xxx.com', 'yyy', 'aaa', 'id=01234567', '']

// その1、後ろから2番目がid文字列であると決め打ち
$id_part = $parts[count($parts)-2]; // 'id=01234567'
$id_data = explode('=', $id_part); // ['id', 01234567]
if ($id_data[0] != 'id') {
    throw new Exception('URLの形式が変更された場合');
}
$id = $id_data[1];
echo '1: ' . $id . "\n";

// その2、後ろから'id=...'の形式になっている部分を探す
for ($i = count($parts); $i >= 0; --$i) {
    $splitted = explode('=', $parts[$i]);
    if (count($splitted) == 2 && $splitted[0] == 'id') {
        $id = $splitted[1];
        break;
    }
}
echo '2: ' . $id . "\n";

// その3、正規表現
$id = preg_replace('/^http:\/\/www\.xxx\.com\/\w+\/\w+\/id=(\d+)\/$/', '\\1', $url);
echo '3: ' . $id . "\n";
id:naoeco

後ろから探していくという方法であれば、確実性は高いかもしれませんね。

すごく参考になります。ありがとうございます!

2010/12/23 21:31:12
id:typista No.4

typista回答回数359ベストアンサー獲得回数72010/12/24 09:56:46

ポイント17pt

「id=01234567/」以降に文字列が無いことが前提なら、

$file = "http://www.xxx.com/yyy/aaa/id=01234567/";
parse_str( strstr( rtrim( $file, '/' ), 'id=' ), $result );
echo $result['id'];

です。

右端の「/」を削除するのが

rtrim( $file, '/' )

で、「/」が無ければ何も処理しないのと同じです。

id:naoeco

ありがとうございます。

parse_strを使う方法もあるのですね〜

いろいろ参考になりました。

ここらで、回答を締め切りたいと思います。

ありがとうございました。

2010/12/24 13:17:35

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません