PHP5の質問です。



[[自転車]]に乗る

このようなテキスト文があります。
[[ ]]に囲まれた部分のみをUTF-8エンコードに変更するにはどうすればいいでしょうか。


$text = "[[自転車]]に乗る";
$text = (mb_ereg_replace('\[\[(.*?)\]\]',mb_convert_encoding('\1','UTF-8'),$text));


これだとUTF-8エンコードがうまくいきません。
どなたかよろしくお願い致します。

回答の条件
  • 1人5回まで
  • 登録:2007/11/30 03:13:12
  • 終了:2007/12/04 20:15:03

ベストアンサー

id:bonlife No.5

回答回数421ベストアンサー獲得回数752007/12/01 07:04:26

ポイント100pt

勘違いしていたらすみません。

やりたいのは、URLエンコードではありませんか。

<?php

# 文字コードはUTF-8にしておく

$base_url = 'http://d.hatena.ne.jp/keyword/';
#$base_url = 'http://www.google.co.jp/search?ie=utf-8&oe=utf-8&q=';

$text = "[[自転車]]に乗った[[男]]が[[東京]]にいた。";


preg_match_all('/\[\[(.*?)\]\]/',$text, $matches);

# var_dump($matches);

# [[,]]内の文字から置換後文字列を生成するため、$matches[1]を利用

$replace_words = array();
foreach ($matches[1] as $match) {
    array_push($replace_words,"<a href=\"" . $base_url . urlencode($match) . "\">$match</a>");
}

# [[,]]を含む文字列を置換するため、$matches[0]を置換

$result = str_replace($matches[0],$replace_words,$text);
print $result;

?>

こういった処理をしたいのであれば、PukiWikiの lib/make_link.php あたりを読むと参考になると思います。

id:tokyosmash

みなさん回答ありがとうございます。

コメントが遅れました。

こちらでまとめてコメントさせていただきます。


自分が何をやりたいのかと言うと、ずばり「wiki記法をHTML化」したいのです。

その過程で[[ ]]に囲まれた部分をサイト内リンクに変更したかったのでこちらの質問をさせていただきました。

皆様からの頂いたアドバイスを基に、UTF-8への変換はあくまでバックグラウンドですればいい事に気付きました。

URLエンコードでキーワードのパラメーターをプログラム部分に渡して、UTF-8への変換はそこでやるべきでした。ardarimさんコメントありがとうございます。

bonlifeさんのスクリプトを少し変えるだけで、ほぼ満足のいく結果を得られました。

他の皆様もありがとうございます。


今WikipediaのWikiデータをHTML化するスクリプトを書いております。

正規表現が苦手なので、また質問させていただくかもしれませんので、その際はよろしくお願い致します。

2007/12/04 20:11:35

その他の回答(4件)

id:studioes No.1

studioes回答回数522ベストアンサー獲得回数612007/11/30 05:50:43

ポイント60pt

$text = "[[自転車]]に乗る";

mb_ereg('\[\[(.*?)\]\]',$text, $mat);

$utf = mb_convert_encoding($mat[1],'UTF-8')

$text = mb_ereg_replace('\[\[(.*?)\]\]',$utf,$text);

こんなんでどうでしょう?

mb_ereg_replace('\[\[(.*?)\]\]',mb_convert_encoding('\1','UTF-8'),$text)

 この書き方は通用しません。

 関数コールの中に入る文字列は、別扱いなので、mb_convert~の様にくくってしまうと、参照出来ません。

id:tokyosmash

早朝より回答ありがとうございます。

質問文をシンプルにし過ぎて失敗してしまいました。

自分が本当にやりたいことは、


[[自転車]]に乗った[[男]]が[[東京]]にいた。


このように[[]]に囲まれた単語が複数あるのです。

この場合ですと条件が変わってしまいますよね。


さらに言えば、最終的には[[]]に囲まれた単語をUTF-8エンコードした後で、で囲みたいのです。

つまり、 [[自転車]] を、以下のように変換したいのです。 

自転車

そして、変数$textの中には[[ ]]で囲まれたテキストが複数ありますので、全て一括で変換したいのです。


UTF-8エンコードしなくていいのならば、mb_ereg_replaceだけで解決できるのですが、エンコードがやっかいです。

質問文が悪かったのは承知の上で、もしこれだけの置換を可能とするスクリプトがあればお教えいただけないでしょうか。


質問は2つ分だとカウントして、ポイント配分させていただきます。

もしお時間があればよろしくお願いします。

2007/11/30 06:30:11
id:tukihatu No.2

牛乳先生(tukihatu)回答回数180ベストアンサー獲得回数322007/11/30 10:46:04

ポイント25pt

こういうことですね。

$text = "[[自転車]]に乗る[[自転車2]]";

preg_match_all('/\[\[(.*?)\]\]/i',$text, $mat);

foreach($mat[1] as $h){

$utf = mb_convert_encoding("<a href='url'>".$h."</a>",'UTF-8');

$text = mb_ereg_replace('\[\['.$h.'\]\]',$utf,$text);

}

echo $text;

preg_match_allを使えば全体で検索できます。

そのあとforeachでひとつずつ呼び出して、<aなどの修飾をつけて置き換え、という流れです。

上の式の場合は、aタグ内などにタイトルとか日本語を書くと、そちらもUTFで書き出されてしまいますが、それが嫌ならmb_ereg_replace('\[\['.$h.'\]\]','"<a href='url'>".$utf."</a>",$text);で。

http://jp2.php.net/manual/ja/function.preg-match-all.php

id:tezcello No.3

tezcello回答回数460ベストアンサー獲得回数692007/11/30 11:20:04

ポイント25pt

e オプションを使うと上手くいくようです。

http://jp.php.net/manual/ja/function.mb-ereg-replace.php

$text = '[[自転車]]に乗った[[男]]が[[東京]]にいた。';
$result = mb_ereg_replace('\[\[(.*?)\]\]', "'abc'.mb_convert_encoding('\\1','UTF-8').'xyz'", $text, 'e');

print_r($result);

結果は、

abc��拶荵�xyzに乗ったabc��yzがabc�延根xyzにいた。

となりました。

'abc', 'xyz' の部分を修正すれば、a タグで囲む事は可能だと思います。

id:y-kawaz No.4

y-kawaz回答回数1421ベストアンサー獲得回数2262007/11/30 11:47:38

ポイント25pt

こんな感じでどうでしょうか?

<?php
$text = "[[自転車]]に乗った[[男]]が[[東京]]にいた。";
$text = preg_replace_callback('/\[\[(.*?)\]\]/',
                create_function(
                        '$m',
                        'return mb_convert_encoding($m[0], "UTF-8");'
                ),
                $text
        );
?>
id:bonlife No.5

回答回数421ベストアンサー獲得回数752007/12/01 07:04:26ここでベストアンサー

ポイント100pt

勘違いしていたらすみません。

やりたいのは、URLエンコードではありませんか。

<?php

# 文字コードはUTF-8にしておく

$base_url = 'http://d.hatena.ne.jp/keyword/';
#$base_url = 'http://www.google.co.jp/search?ie=utf-8&oe=utf-8&q=';

$text = "[[自転車]]に乗った[[男]]が[[東京]]にいた。";


preg_match_all('/\[\[(.*?)\]\]/',$text, $matches);

# var_dump($matches);

# [[,]]内の文字から置換後文字列を生成するため、$matches[1]を利用

$replace_words = array();
foreach ($matches[1] as $match) {
    array_push($replace_words,"<a href=\"" . $base_url . urlencode($match) . "\">$match</a>");
}

# [[,]]を含む文字列を置換するため、$matches[0]を置換

$result = str_replace($matches[0],$replace_words,$text);
print $result;

?>

こういった処理をしたいのであれば、PukiWikiの lib/make_link.php あたりを読むと参考になると思います。

id:tokyosmash

みなさん回答ありがとうございます。

コメントが遅れました。

こちらでまとめてコメントさせていただきます。


自分が何をやりたいのかと言うと、ずばり「wiki記法をHTML化」したいのです。

その過程で[[ ]]に囲まれた部分をサイト内リンクに変更したかったのでこちらの質問をさせていただきました。

皆様からの頂いたアドバイスを基に、UTF-8への変換はあくまでバックグラウンドですればいい事に気付きました。

URLエンコードでキーワードのパラメーターをプログラム部分に渡して、UTF-8への変換はそこでやるべきでした。ardarimさんコメントありがとうございます。

bonlifeさんのスクリプトを少し変えるだけで、ほぼ満足のいく結果を得られました。

他の皆様もありがとうございます。


今WikipediaのWikiデータをHTML化するスクリプトを書いております。

正規表現が苦手なので、また質問させていただくかもしれませんので、その際はよろしくお願い致します。

2007/12/04 20:11:35
  • id:ardarim
    余計なおせっかいかもしれませんが、[[ ]]に囲まれた一部分だけをUTF-8にすると、文字列全体のエンコーディングがばらばらになる(文中にUTF-8とShiftJISなどが混在する)ため、ブラウザで正しく表示できません。
    回答3の方のような表示結果となります。

    おそらく、本当にやりたいことを推測するに、[[ ]]に囲まれた部分をUnicodeの数値実体参照に置き換える、とかじゃないですか?
    つまり、こんな感じ。
    [[&#33258;&#36578;&#36554;]]に乗った[[&#30007;]]が[[&#26481;&#20140;]]にいた。

    PHPはわかりませんので的確な回答は示せませんが...
  • id:studioes
    いや、UTF8にしてから、URLエンコードしたいんじゃない? SEOで

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

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

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

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