ランダム(不規則)な文字列の置換えについて - PHPプロ!Q&A掲示板

3058

  • 0P

ランダム(不規則)な文字列の置換えについて

質問日時 / 2011年1月19日 07:28    回答数 / 7件

Questioner:  id_yoakura  このエントリーをはてなブックマークに追加 

キーワード / PHPSESSID    セッション    replace   

初めて投稿させていただきます。
文字列置換について、色々と調べたのですが全く解決しなかったのでこの場を借りてご質問させて頂きます。
早速ですが記述から記載させて頂きます。

$str = file_get_contents('http://example.com/');
$replaced = str_replace("index.php?ref=123abc", "index.php?ref=456def", $str); 
echo $replaced;

このように一定の文字列に対しては置換ができたのですが、
index.php?ref=123abc
の箇所が
index.php?ref=123abc&PHPSESSID=qazwsxedcrfvtgbyhnujmikolpqazwsx
のようにPHPSESSIDのセッションID(毎回変わるランダムな32桁の文字列)が付いてきた場合に
index.php?ref=456def
に置換える方法がわかりません。
&PHPSESSIDの文字列の先頭部分から右に43文字目※(&PHPSESSID=の所で11文字)+(IDの所で32文字)※までを
index.php?ref=456def
に桁数で置き換える方法や
初めからPHPSESSIDのセッションIDの部分を表示させない方法など
ここ数週間色々考えてみましたがどうしてもわかりませんでした。
PHP初心者ですので、なるべくわかりやすく教えて頂けると幸いです。
よろしくお願いいたします。

この質問への意見の募集は締め切られ、ポイントは既に配分されました。
意見を投稿することはできますが、ポイントを受け取ることはできません。



ツリー一覧

┣A01shimix>初めからPHPSESSIDのセッションIDの部分を表示させな
┃┗A01-1id_yoakuraおはようございます。shimixさん即答ありがとうござい
┃ ┣A01-1-1wintermute>>CODE <A href="/ad.php?com=detail&id_i=XXXXX&PHP
┃ ┃┗A01-1-1-1id_yoakuraセッションに対しての知識は全くありません。 今まで
┃ ┗A01-1-2shimix><A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=
┃  ┗A01-1-2-1id_yoakurashimixさんありがとうございます。 まさにこれが私が
┗A02yuu_a0ちゃんと読んでないけど、いい加減だね、まぁ、楽にい

回答一覧

並び替え:

A01
answerershimix [1月19日 09:26] (最終編集:1月19日 09:32)

>初めからPHPSESSIDのセッションIDの部分を表示させない方法など

アクセス先のサイトの問題だとは思います。

http://www.php.net/manual/ja/session.idpassing.php
http://www.php.net/manual/ja/session.configuration.php#ini.session.use-only-cookies

str_replaceしたものを「どう使おうとしているのか」によって解は違うと思いますが、セッション名がPHPSESSIDと決まっているわけでもありませんし、無効なセッションIDなら無視されるだけでしょうから、何もしないで(そのまま残しておいて)いいと思いますけど。何か不具合がありますでしょうか?

なお「セッション名をPHPSESSIDに限定」であれば、「&PHPSESSID=」の位置を探して(strposなど)その前後をsubstrで抜き出して連結する・・というのを対象がなくなるまでLoopというのでもいいかもしれません(書けるのであれば正規表現でのreplaceもいいとは思いますけど)。

この意見に回答する

ツリーへ TOPへ

A01-1
replyerid_yoakura [1月19日 09:55]

おはようございます。shimixさん即答ありがとうございます。
substrでの方法も考えてはみたのですが複雑そうで・・・
何か下記のような関数はないでしょうか?
■特定の文字列(ここではPHPSESSID)の先頭(ここではP)から右側に42文字分削除する。
このように指定した文字列の右側に指定した文字数の文字列を削除できる関数があれば良いのですが!

失礼ながらまだ具体的なソースをあげてませんでしたね。
file_get_contentsで取得した外部ファイルには以下のようにリンクが並んでます。

⇒<A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY">タイトル</A><BR>

⇒<A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY">タイトル2</A><BR>

⇒<A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY">タイトル3</A><BR>

※Xは5桁の数字
※Yは32桁の英数字
※XとYはいずれも毎回変わる

このリンクの
<A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY">

<A href="/ad.php?iid=XXXXX&aid=12345&pfg=1">
と置換えたいと思ってます。

携帯用のサイトなので出来ればソースも少なく処理が早いもので表示させたいです。
いかがでしょうか?

この意見に回答する

ツリーへ TOPへ

A01-1-1
replyerwintermute [1月19日 10:14]

  1. <A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY">1. 
  2. <A href="/ad.php?iid=XXXXX&aid=12345&pfg=1">
1. セッションidを示す名前を勝手に変えていいのでしょうか?(確か、変更する為の関数があったはず)
2. urlをパースする関数があったはずなので、それを使ってみてはどうでしょうか?(まぁ、正規表現でもできますが)
3. id_iがiidに変わったり、comが無くなって変わりにaidが追加されている(しかも内容が変わっている)規則性が分からない。

# ところで、セッションについて理解されていますか?

この意見に回答する

ツリーへ TOPへ

A01-1-1-1
replyerid_yoakura [1月19日 10:49]

セッションに対しての知識は全くありません。
今まではこのようにしてました。

$befour = array(
    'com=detail&id_i=', 
    '&' 
    );
$after = array(
     'iid=', 
    '$aid=12345&pfg=1&'
    );
$array = str_replace($befour, $after, $str);
echo $array;

こんな感じです。

この意見に回答する

ツリーへ TOPへ

A01-1-2 満足
replyershimix [1月19日 10:16] (最終編集:1月19日 11:06)

><A href="/ad.php?com=detail&id_i=XXXXX&PHPSESSID=YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY">
>を
><A href="/ad.php?iid=XXXXX&aid=12345&pfg=1">

?com=detail&id_i=XXXXX → _?iid=XXXXX&aid=12345&pfg=1 などといった不思議な置換がある(規則性がまったくわかりません)ということは、file_get_contentsで読み込むのは(そういう置換で動作可能なように作成された)「ご自分のサイト」なんでしょうか?そうであれば、file_get_contentsでのアクセス(ローカルアクセスになりますよね)に対してPHPSESSIDを付けない(セッションを発行しない)方向の方が楽だと思いますけど・・


なお、&PHPSESSID=(32文字の文字列) を削除するだけなら(最初のレスで書いたとおり)
  1. while ($pos = strpos($str, '&PHPSESSID=')) {
  2.     $str = substr($str, 0, $pos) . substr($str, $pos + 43, strlen($str) + $pos - 43);
  3. }
でいいと思いますが、面倒ですかねぇ・・・

この意見に回答する

ツリーへ TOPへ

A01-1-2-1
replyerid_yoakura [1月19日 10:58]

shimixさんありがとうございます。
まさにこれが私がやりたかった事です。
ソースも軽くてとても気に入りました。
お陰でやっと肩の荷がおりました。
感謝してます。
ありがとうございました。

この意見に回答する

ツリーへ TOPへ

A02
answereryuu_a0 [1月20日 05:11] (最終編集:1月20日 05:21)

ちゃんと読んでないけど、いい加減だね、まぁ、楽にいこうぜって話もあるけど。

処理が早いの遅いのって話しだけど、そいつはエディタで編集するレベルの話じゃないのかい?実行段階で置換する必要性は?

あ~ちなみに、SESSION ID が URL に付加されて困るという類の話なら、session.use_trans_sid を Off っとく。デフォルトで Off のはずだけど。

とりあえず セッションに関してもう少し調べたほうがいい。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
array_mergeの再帰処理の動作について
 このエントリーをはてなブックマークに追加 
A
>1個になったとき$leftを返しますが、 >このとき、最終的な$leftはnullになるかと思います。 いいえ、最後は「渡された配列をそのまま」返します。要素が2以上あるときとの違いは(並べ替えずに戻るので...

>>続きを読む

再帰関数は最初の内は混乱しますが、非常に上手く使える場面もいずれ出てきます。これを機会に学んでいけるといいですね。

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)