• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:preg_replace() で、 urlencode())

preg_replace()を使用してURLエンコードする方法とエラーの対処法

このQ&Aのポイント
  • preg_replace()を使用して[[文字列]]を<a href="文字列">文字列</a>に置き換えたいがエラーが発生する
  • URLエンコードの際に文字エンコーディングを変換する方法とエラーの対処法
  • レンタルサーバーでmbstring.encoding_translation=Offの状態で困っている

質問者が選んだベストアンサー

  • ベストアンサー
  • asahina02
  • ベストアンサー率47% (95/202)
回答No.2

#1です > それも検討してみることにします。 一応私は「秀丸」というを使ってます。 > これらは全て同様に設定して、防ぐしかないのでしょうか。 $str = preg_replace( "/\[\[([^\].]+)\]\]/e" , "'<a href=\"' . urlencode(\"$1\") . '\">$1</a>'" , $str ); こんな感じでいけるみたいです。 これは文字コードがというよりは、構文的な問題になるのかなぁ・・ P.S.  エラーになるという場合でも、どんなエラーがどの行で出るのか等  分かる範囲で書いておくといいですよん

yakkuncom
質問者

お礼

全く問題なく動くようになりました。 迅速なご回答を有り難う御座います。 構文的な問題でしたか・・・。 何故、\"$1\"とすれば上手くいくのかすら分かりません; ところで、正規表現でドット(.)を外す理由は、上の階層にアクセスされることを防ぐためでしょうか? PATH_INFOで引数を受けているので必要ないでしょうかね? > 一応私は「秀丸」というを使ってます。 有り難う御座います。参考にさせて頂きます。 > どんなエラーがどの行で出るのか等... そうですね。失礼致しました。 次回から気をつけます。

yakkuncom
質問者

補足

御免なさい。 >> PATH_INFOで引数を受けているので必要ないでしょうかね? と書きましたが、PATH_INFOでも上の階層へリンク出来てしまうのですね。 大変失礼致しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.1

 $str = mb_convert_encoding( $str, "euc-jp", "sjis" );  $str = preg_replace( "/\[\[([^\].]+)\]\]/e" , "'<a href=\"' . urlencode($1) . '\">$1</a>'" , $str );  $str = mb_convert_encoding( $str, "sjis", "euc-jp" ); こんな感じかな・・ replaceはEUCで行いつつ、SJISに戻して表示する ※正規表現部分ちょっと変更してみた でも、そもそも全体をEUCで書いちゃえば↑のような面倒臭いことしなくていいんじゃないかなぁ

yakkuncom
質問者

お礼

回答、どうも有り難う御座います。 ご教授頂いたもので上手くいきました。感謝致します。 > 全体をEUC これまでWindows標準のメモ帳(EUCでの保存不可)しか使っていなくて、 他のソフトを使うのは避けたかったのですが、何かとEUCで保存した方が便利そうですね。 それも検討してみることにします。 > ※正規表現部分ちょっと変更してみた 他にも「 ( ) : # 」といった記号が含まれているとエラーになるようなのですが、 これらは全て同様に設定して、防ぐしかないのでしょうか。 文字コードについては、恥ずかしいほど無知故に全く分からないのですが、 どういった物を例外処理する必要があるのでしょうか。 p.s. >> $str="表"; >> $str=urlencode(mb_convert_encoding($str, "EUC-JP", "SJIS")); というのは、そもそも "表" とした時点でエラーになるのですね。 失礼致しました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • preg_replace_callback が渡す変数の扱い

    preg_replcace_callback を使用して、<a>タグ内のURLの字数を制御するコードに取り組んでいます。詳しい方アドバイスしてくださると助かります。 下のコードの、shorten(カスタム関数)に渡されるデータが配列なのですが、並列に並んだ配列のようなのです。echo をかけてみると、ArrayArray と表示されます。しかし、Array([0]=>Array [1]=>Array) ではないので、どうやって 処理をかけて return すればよいのか途方にくれています。 もしよい方法をご存知の方おられましたらどうぞよろしくお願いいたします。 <? $str = <<<HERE //長いURLのサンプルです。ここの掲示板の処理で途中で表示がカットされていますが、<a href="http://長いURL">http://長いURL</a>という構成になっています。 <a href="http://gooooooooooooooooooooooooooooooooooogle.co.jp">http://gooooooooooooooooooooooooooooooooooogle.co.jp[</a> <a href="http://yahooooooooooooooooooooooooooooooooooo.co.jp">http://yahooooooooooooooooooooooooooooooooooo.co.jp</a> HERE; $pattern = "#<a(.*?)>(.*?)<\/a>#s"; $str = preg_replace_callback($pattern, 'shorten', $str); echo $str; function shorten($matches) { foreach($matches as $index => $match) { if (strlen($match) > 20) { $matches[$index] = substr($match, 0, 20) . '....'; } } return $matches; } ?>

    • ベストアンサー
    • PHP
  • PHP 入力値 文字化け

    phpでFormで入力した値(日本語)が文字化けしてしまいます。 環境は WinXp pro apache2.0.59 php 4.4.7 php.iniのおもな設定ですが、 mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = On mbstring.detect_order = auto mbstring.substitute_character = none; ブラウザからすべてShiftJisで入力されているのですが、 それがうまく EUC-JPに内部エンコードされていません。 mb_convert_encording($str,"EUC-JP","auto")をスクリプト内で 記述するとうまく表示されますが、なんとか設定で文字化けしないよう にできないでしょうか? よろしくお願いします。

    • 締切済み
    • PHP
  • preg_replace()でマッチ文字列に関数を

    PHPでのpreg_replace()でマッチした文字列に関数を適用したいのですが、上手くいきません。 $str = "hogeHoge"; $pattern = '/(h.ge)/i'; $replacement = strtoupper("$1"); echo preg_replace($pattern, $replacement, $str); // 期待する結果 : HOGEHOGE // 実行した結果 : hogeHoge 根本的に間違っているかもしれませんが、ご指南いただければ幸いです。

    • ベストアンサー
    • PHP
  • preg_replace関数のtarget属性

    ○質問の主旨 preg_replace関数の引数の一部にある<a>タグ内の target属性を"_blank"にしていますが、新しいウィンドウが開かず、 元の画面のまま、href属性のリンク先に遷移します。 新しいウィンドウにhref属性のURLを表示させるためには どうすれば良いでしょうか? ご存知の方がいらっしゃいましたら、ご教示願います。 ○質問の補足 現在、以下のようなコードを用いています。 $tweet['text']=preg_replace("/(http:\/\/t.co\/[a-zA-Z0-9]{10})/", "<a href=\"\\0\" target=\"_blank\">\\0</a>", $tweet['text']); $tweet['text']とは、Twitter RESTAPI1.1のGET search/tweetsから ひっぱってきた文字列で、ツィート本文のことです。 コード全体の意味は、 「ツィート本文にhttp://t.co/○○○○○○○○○○という文字列があれば、 そのリンク先にtarget=_blankで遷移しなさい」 ということになります。 以上、よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • php.iniを変更したのにUFT-8が文字化け

    こんにちは。教えて下さい。 Movable TypeをUTF-8で運営しようと思いましたが、使用中のサーバーのphpの文字コードがEUC-JPでした。 サーバーに問い合わせたところ、php.iniを編集するだけで文字コード変更できます、とのこと。 そこで、php.iniの mbstring.language = Japanese mbstring.encoding_translation = On mbstring.http_input = auto mbstring.http_output = EUC-JP mbstring.internal_encoding = EUC-JP mbstring.detect_order = auto mbstring.substitute_character = none; を mbstring.language = neutral mbstring.encoding_translation = On mbstring.http_input = auto mbstring.http_output = UTF-8 mbstring.internal_encoding = UTF-8 mbstring.detect_order = auto mbstring.substitute_character = none; にしてみました。 当方初心者で、php.iniは初めていじりました。 EUC-JPとあった箇所またはJapaneseとあった箇所を変更したのみです。 また、Movable Typeのmt-config.cgiで 文字コードをEUC-JPからUTF-8に変更。 Movable Typeの文字コード関連の変更はこのファイルのみですのでこれで大丈夫・・・。 そう思ったのですが、Movable Typeが文字化け・・・。 php.iniの設定が間違っているのでしょうか? 助けてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • urlencode

    urlencodeの引数に"Q&A"見たいな文字列を入れると"Q"だけになっちゃいます。 マニュアルでもチラッと問題ですと書いてましたが、回避策があれば教えてGOO!

    • 締切済み
    • PHP
  • urlencodeがうまくいかない

    日本語をurlencodeを使ってGETで送っているのですが受ける側で元の文字に戻らないものがあります。 送信する文字:長野営業所資産管理表2005.xls urlencodeした文字:%92%B7%96%EC%89c%8B%C6%8F%8A%8E%91%8EY%8A%C7%97%9D%95%5C%82Q%82O%82O%82T.xls 受け取った文字:長野営業所資産管理表\2005.xls 「\」が一文字入ってしまいます。 全角の数字の送り方なんてあるのでしょうか?? よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phpでの書き出しでの文字化け解消について

    お世話になります。 SJISを使いたく、php.iniを次のように設定しましたが、まったく文字が読めない状態で書き出されてしまいます。問題点をお教えいただけないでしょうか。 default_charset="Shift_JIS" mbstring.language=Japanese mbstring.internal_encoding=EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation=On mbstring.detect_order=auto また、内部円コーディングのmbstring.internal_encoding=EUC-JP はこれでよいのでしょうか。SJISを使うなら、SJISのほうがよいのでしょうか。 どなたか、お助けいただけないでしょうか。 どうか、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 日本語が使いたいのですが[mbstring]設定がわかりません

    環境は winxp sp2 apache 2.0.54 php 5.0.4 argosoftmailserver php.iniの設定は [mbstring] mbstring.language = Japanese mbstring.internal_encoding = EUC-JP mbstring.http_input = auto mbstring.http_output = SJIS mbstring.encoding_translation = Off mbstring.detect_order = auto mbstring.substitute_character = none です。足らない事があればお願いします。 下はphpの文です。 <?php $subject = "テスト"; $message = "あいうえお"; $test="日本語エンコーディングテスト"; print "$test (" . mb_detect_encoding($test) . ")<br>"; print ("mbstring.http_input=". mb_http_input() ."<br>"); print ("mbstring.http_output=". mb_http_output() ."<br>"); print ("mbstring.internal_encoding= ".mb_internal_encoding()."<br>"); $subject = mb_convert_encoding($subject, "SJIS", "EUC-JP"); $message = mb_convert_encoding($message , "SJIS", "EUC-JP"); mb_language("Japanese"); $chk = mb_send_mail('******@*******',$subject,$message,'From:***@******.dyndns.org'); if($chk==FALSE) { print "送信失敗"; } else { print "送信完了"; } ?> エンコードテストの結果は以下です。 日本語エンコーディングテスト (SJIS) mbstring.http_input= mbstring.http_output=SJIS mbstring.internal_encoding= EUC-JP よろしくお願いします。

    • ベストアンサー
    • PHP
  • preg_replace内+URLエンコード

    現在、 $hogehoge=preg_replace( "/([^,\(\)]+)/" , '<a href="./hoge.php?hoge=\1">\1</a>', $hoge); このように変数をそのままリンク処理しております。 現在はこの変数に1バイト文字のみしか入っていないのですが、今後2バイト文字も取り扱おうつもりですので、urlencode関数を使いURLエンコードを組み込みたく思います。 このままのカタチで組み込むことは可能でしょうか?

    • 締切済み
    • PHP