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

【PHP】mb_ereg_replaceを使って、文字列中にある「(※N)」(Nは1から10までの数字)という文字列を、「<a href="#refN">(※N)</a>」(Nは1から10までの数字で置き換える前の数値を保持)に置き換えるには、どのような正規表現にすればよいでしょうか?括弧は半角括弧なのでエスケープが必要ですが、※が曲者のようでいくつか思いついた正規表現を実行してもエラーになってしまいます。

●質問者: 敷守ほむら
●カテゴリ:インターネット ウェブ制作
✍キーワード:PHP エスケープ エラー 数字 文字列
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●35ポイント

こんな感じでどうでしょう。

$sour は変換前の文字列です。

mb_ereg_replace("([0-9]+)", "<a href=\"#ref\\1\">(※\\1)</a>", $sour);

※が曲者のようでいくつか思いついた正規表現を実行してもエラーになってしまいます

ご利用の文字コードは何ですか?

スクリプトの冒頭で mb_internal_encoding と mb_regex_encoding で文字コードを指定してみて下さい。

◎質問者からの返答

ありがとうございます。

文字コードは確かに問題かもしれませんね。

変換しようとする文字列については、mb_ereg_replaceをする前にUTF8に変換しています。

mb_languageはJapanese、mb_internal_encodingはUTF-8を指定しています。

mb_regex_encodingはしていませんでした・・・

コメント欄でkn1967さんが指摘されていますが、これだと意図していない置換になってしまいます。。。

mb_regex_encodingにUTF-8を指定してkn1967さんの命令で実行してみたところ上手くいきました(^^)


2 ● kn1967
●35ポイント
<?php
 $text = "脚注(※1)\n脚注(※2)\n脚注(※3)\n脚注(※4)\n脚注(※5)\n"
 . "脚注(※6)\n脚注(※7)\n脚注(※8)\n脚注(※9)\n脚注(※10)\n";
 echo $text;
 echo "<br />\n";
 echo mb_ereg_replace('\(※(\d+)\)',"<a href=\"#ref\\1\">(※\\1)</a>",$text);
?>
◎質問者からの返答

ありがとうございます。

試してみたんですが、エラーになってしまいます。。。

Warning: mb_ereg_replace() [function.mb-ereg-replace]: mbregex compile err: unmatched close parenthesis in (エラーの箇所)

pahooさんの指摘にあったmb_regex_encodingで文字コードを指定したところ上手くいきました(^^)


3 ● y-kawaz
●10ポイント

mb_ereg_replaceとか使わず preg_replace で普通に出来ますが。

<?php
$text = "あいうえお(※1) hogehoge(※99)です\n";
echo preg_replace('/\(※([0-9]+)\)/', '<a href="#ref$1">(※$1)</a>', $text);
?>
◎質問者からの返答

ありがとうございます。

preg_replaceだと上手くいくんですよね・・・

ただ、問題はmb_ereg_replaceです。。。

関連質問


●質問をもっと探す●



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