参照を使ったリンクをurlエンコードする方法 - PHPプロ!Q&A掲示板

475

  • 0P

参照を使ったリンクをurlエンコードする方法

質問日時 / 2007年5月2日 00:04    回答数 / 5件

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

キーワード / 正規表現    置換    preg_replace   

やりたいこと
文中にあるリンクをurlエンコードした形にしたい。
http://5go.biz/ → http%3A%2F%2F5g0.biz%2F

  1. $bun = preg_replace('/<a href="(.*?)">/i','<a href="'.urlencode("$1").'">',$bun);

とやってもダメでした。
ご教授お願いします。

(マッチングを置換を何度かして回りくどくやるとできると思うのですがpreg_replaceではどうやってやるのでしょうか?)

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



ツリー一覧

┣A01wintermute「どのようにダメだったのか?」が書かれていないと、
┃┗A01-1yokkaman2007ご返答有難うございます。 まずはどのようにダメか
┗A02kaitauこんにちは。 多分yokkaman2007さんがされたいことは
 ┗A02-1yokkaman2007wintermute様、kaitau様回答有難うございました。 ka
  ┗A02-1-1kaitauこんにちは。 率直に言って、なぜそうなるのか理解

回答一覧

並び替え:

A01
answererwintermute [5月2日 09:50]

「どのようにダメだったのか?」が書かれていないと、誰にも分からないと思うのですが、どうでしょうか?

まぁ、想像を働かせてみると、
  1. <a href="aaa">aaa</a>
  2. <b>bbb</b>
  3. <a href="ccc">ccc</a>
というのが、<a href="の部分から最後の">cccの部分までマッチしてしまったのではないかと推測します。

で、これを回避するには、パターン修飾子(iとか使っているのだから意味分かりますよね?)のUを使ってみると出来る時があります。
(他に、パターン中で、うまく?を使っても回避できるかもしれません。)

この意見に回答する

ツリーへ TOPへ

A01-1
replyeryokkaman2007 [5月2日 12:09]

ご返答有難うございます。

まずはどのようにダメかと言うと「$1」がそのままurlエンコードされて「%241」となってしまいます。
(ちなみに$bun = preg_replace('/<a href="(.*?)">/i','$1',$bun);でやるときちんとurlがぬきだれているのでマッチングはきちんとしていると思います。)

次に「U」ですが 上記と同じように$1→%241です。

この意見に回答する

ツリーへ TOPへ

A02 満足
answererkaitau [5月2日 13:27]

こんにちは。
多分yokkaman2007さんがされたいことはe修飾子を使って置換文をPHPコードとして
評価させれば解決すると思います。

$bun = preg_replace('/<a href="(.*?)">/ie','\'<a href="\'.urlencode("$1").\'">\'',$bun);

で、いかがでしょうか。
第1引数の中の / のあとに、eを追加しています。
そして、ぱっと見わかりにくいですが、preg_replaceの第2引数の外側の''の中の文字列が、文字列を連結するPHP文になっています。(一つながりの文字列として評価させるため、いったんシングルクオートは全てエスケープしています)

このe修飾子についは、PHPマニュアルのpreg_replaceの説明
http://www.php.net/manual/ja/function.preg-replace.php
の、例 1624 に記載があります。

また、他の修飾子の種類については、
「パターン修飾子」http://www.php.net/manual/ja/reference.pcre.pattern.modifiers.php
に説明があるので、こことpreg_*関数の各種説明である程度やれることは見えるのではないかと思います。

以上、ご参考になれば。

この意見に回答する

ツリーへ TOPへ

A02-1
replyeryokkaman2007 [5月2日 17:27]

wintermute様、kaitau様回答有難うございました。
kaitau様の方法で解決できました。

ただ説明を読んでもなぜそうなるのか理解できませんでした。
よろしければ簡単に解説していただけないでしょうか?
よろしければお願いします。

この意見に回答する

ツリーへ TOPへ

A02-1-1
replyerkaitau [5月7日 13:54]

こんにちは。

率直に言って、なぜそうなるのか理解できませんでした、だけだと
どうにも回答の仕様がないのですが・・・。

経験上、ハマるとわかりにくい所を推測しますと、
おそらくyokkaman2007さんは、

  $bun = preg_replace('/<a href="(.*?)">/i','<a href="'.urlencode("$1").'">',$bun);

の記述で
preg_replaceの中で
'<a href="'.urlencode("$1").'">'
の動作が行われることを期待していたと思いますが、PHPの言語の性格上、
関数の引数に渡すのは値であり、式は渡せません。
よって、行われるのは上記の文を評価し、その値をpreg_replaceに渡す動きです。
言い換えれば

  $replace_ment = '<a href="'.urlencode("$1").'">';
  $bun = preg_replace('/<a href="(.*?)">/i',$replace_ment,$bun);

とほぼ同じ動作になるはずです。

式をそのままpreg_replaceに渡す事はできない。
それでもマッチング結果に何かしら処理を施してから置換結果にあてる必要がある。
それを解決するための 方法の一つ として、提供したのが、前の回答の内容でして、
preg_replaceに、e修飾子を指定して、「この内容の命令を中で実行してね」という
命令文そのものを第二引数に渡すというやりかたです。渡された命令文は、
preg_replaceの中で実行されるので、この中に書いてある$1のキーワードも
有効になります。

こんなところで終わりにします。

理解できないところ、納得できないところを質問する場合、
どのポイントがわからないのか絞り込んで説明するか、
或いは、自分の予想(仮説)を順序だてて示して、自分の期待値と何が違うのか、
辺りを明示していただかないと、回答が徒労に終わる場合もありますので、
ご配慮いただきたく。

この意見に回答する

ツリーへ TOPへ

<<質問一覧へ



Pick Up Q&A

Q
ログファイルの中の空のデータ行を削除したい
 このエントリーをはてなブックマークに追加 
A
ログのデータ個数(列数)が固定で、空のログが"<><><>"だと既知であれば if ($line === "<><><>") { continue; } で読み飛ばしてもいいのでは? ...

>>続きを読む

まずは配列や文字列の扱いから、じっくり勉強して行きましょう。

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

Q&A掲示板 新着情報