現在、Wikiのようなものを作ろうとしていて、
文章中に [[文字列]] があった場合、 <a href="文字列">文字列</a> のような形に置き換えたいのですが、
次のようにすると、$strが「マ」などを含んでいる場合にエラーが起こってしまいます。
$str=preg_replace("/\[\[(.+)\]\]/e","'<a href=\"'.urlencode($1).'\">$1</a>'",$str);
「表」なども、もちろんエラーになります。
どのようにすれば良いのでしょうか。
あるいは、そもそも、別の方法で置き換えた方が良いのでしょうか。
また、過去ログ(http://oshiete1.goo.ne.jp/kotaeru.php3?q=1844374)に、
「表」といった\を含む文字列のURLエンコードをする際は、
「EUC」に文字エンコーディングを変換してから行うようにとの回答がありましたが、
以下のようにしてもエラーが起こってしまいます。
$str="表";
$str=urlencode(mb_convert_encoding($str, "EUC-JP", "SJIS"));
どのように書けば良いのでしょうか。
合わせて困っております。
ご教授を宜しくお願い致します。
なお、
mbstring.encoding_translation=Off
になってます。レンタルサーバーのため、変更できません。
No.2ベストアンサー
- 回答日時:
#1です
> それも検討してみることにします。
一応私は「秀丸」というを使ってます。
> これらは全て同様に設定して、防ぐしかないのでしょうか。
$str = preg_replace( "/\[\[([^\].]+)\]\]/e" , "'<a href=\"' . urlencode(\"$1\") . '\">$1</a>'" , $str );
こんな感じでいけるみたいです。
これは文字コードがというよりは、構文的な問題になるのかなぁ・・
P.S.
エラーになるという場合でも、どんなエラーがどの行で出るのか等
分かる範囲で書いておくといいですよん
この回答への補足
御免なさい。
>> PATH_INFOで引数を受けているので必要ないでしょうかね?
と書きましたが、PATH_INFOでも上の階層へリンク出来てしまうのですね。
大変失礼致しました。
全く問題なく動くようになりました。
迅速なご回答を有り難う御座います。
構文的な問題でしたか・・・。
何故、\"$1\"とすれば上手くいくのかすら分かりません;
ところで、正規表現でドット(.)を外す理由は、上の階層にアクセスされることを防ぐためでしょうか?
PATH_INFOで引数を受けているので必要ないでしょうかね?
> 一応私は「秀丸」というを使ってます。
有り難う御座います。参考にさせて頂きます。
> どんなエラーがどの行で出るのか等...
そうですね。失礼致しました。
次回から気をつけます。
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で書いちゃえば↑のような面倒臭いことしなくていいんじゃないかなぁ
回答、どうも有り難う御座います。
ご教授頂いたもので上手くいきました。感謝致します。
> 全体をEUC
これまでWindows標準のメモ帳(EUCでの保存不可)しか使っていなくて、
他のソフトを使うのは避けたかったのですが、何かとEUCで保存した方が便利そうですね。
それも検討してみることにします。
> ※正規表現部分ちょっと変更してみた
他にも「 ( ) : # 」といった記号が含まれているとエラーになるようなのですが、
これらは全て同様に設定して、防ぐしかないのでしょうか。
文字コードについては、恥ずかしいほど無知故に全く分からないのですが、
どういった物を例外処理する必要があるのでしょうか。
p.s.
>> $str="表";
>> $str=urlencode(mb_convert_encoding($str, "EUC-JP", "SJIS"));
というのは、そもそも "表" とした時点でエラーになるのですね。
失礼致しました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# C# 浮動小数の数値文字列化 1 2022/04/18 15:15
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フォントの色を変えるには?
-
トランザクションが原因?DBに...
-
ロリポップのサーバでのPEARイ...
-
SELECTの値を保持する
-
phpのfopenで行単位のfseekは出...
-
クラスの中でincludeするとき、...
-
phpにてファイルをアップロード。
-
php7のhtmlentitiesはEUC-JPを...
-
pearのMailライブラリがうまく...
-
PHPで新しいウインドウで開く命...
-
phpファイルの編集について
-
Subversionのリポジトリの削除
-
画像アップロードのファイル名...
-
centos6のlogにscript not foun...
-
ファイル一覧表(LAN内の別PC)
-
10MB以内のJPG画像
-
MkDir関数
-
別ファイルの変数を呼び出した...
-
php my adminより取り出したデ...
-
フォームで戻った際に入力済み...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フォントの色を変えるには?
-
PHP8を使うと、大量のWarningが...
-
トランザクションが原因?DBに...
-
ワードプレスサイト PHP8.0.25...
-
PHPで、エラーがない場合のみ画...
-
「@$変数」の「@の意味は?」
-
パースエラーとは?
-
phpでクラスのメソッドで同名の...
-
phpでget_headers()が使えない?
-
PHPでネットワークドライブのop...
-
PHPでfatal errorが出ても無視...
-
phpでPEAR::DBを使っているので...
-
awsにApacheとPHPを入れて、何...
-
error_reporting(0);にも関わら...
-
正規表現での最後尾のバックス...
-
これは例外処理でしょうか?
-
SELECTの値を保持する
-
PHPにて外部サイト内容が取得不...
-
iframeからのアクセスか、ブラ...
-
PHP mb_send_mail メール送信 5...
おすすめ情報