人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP5の質問です。


[[自転車]]に乗る

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


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


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

●質問者: tokyosmash
●カテゴリ:インターネット ウェブ制作
✍キーワード:UTF-8 エンコード テキスト 自転車
○ 状態 :終了
└ 回答数 : 5/5件

▽最新の回答へ

1 ● studioes
●60ポイント

$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?の様にくくってしまうと、参照出来ません。

◎質問者からの返答

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

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

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


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


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

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


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

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

自転車

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


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

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


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

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


2 ● 牛乳先生(tukihatu)
●25ポイント

こういうことですね。

$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


3 ● tezcello
●25ポイント

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 タグで囲む事は可能だと思います。


4 ● y-kawaz
●25ポイント

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

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

5 ●
●100ポイント ベストアンサー

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

やりたいのは、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 あたりを読むと参考になると思います。

◎質問者からの返答

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

コメントが遅れました。

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


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

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

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

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

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

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


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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ