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

回答の条件
  • 1人2回まで
  • 登録:2009/03/17 16:59:52
  • 終了:2009/03/18 21:59:33

回答(3件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/03/17 17:16:38

ポイント35pt

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

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

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

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

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

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

id:tail_furry

ありがとうございます。

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

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

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

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

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

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

2009/03/18 12:35:56
id:kn1967 No.2

kn1967回答回数2915ベストアンサー獲得回数3012009/03/17 17:27:57

ポイント35pt
<?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);
?>
id:tail_furry

ありがとうございます。

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

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

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

2009/03/18 12:36:30
id:y-kawaz No.3

y-kawaz回答回数1421ベストアンサー獲得回数2262009/03/17 17:43:22

ポイント10pt

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

<?php
$text = "あいうえお(※1) hogehoge(※99)です\n";
echo preg_replace('/\(※([0-9]+)\)/', '<a href="#ref$1">(※$1)</a>', $text);
?>
id:tail_furry

ありがとうございます。

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

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

2009/03/18 12:42:51
  • id:kn1967
    3/>preg_replace で普通に出来ますが。

    環境の違いを考慮してないとしか思えないのだけど
    質問者の環境を知っているのかしら?
    何のために mb_系 を使っているのか考慮してみたのかしら?
       ・・・
    普通って、どのような状態を普通と言うのかしら?
  • id:kn1967
    pahoo氏のコードでは”全ての数字”を置換してしまいますね。
    コメント欄ででも訂正入ると良いですね。
  • id:pahoo
    回答#1の訂正です。
    mb_ereg_replace("(※([0-9]+))", "<a href=\"#ref\\1\">(※\\1)</a>", $sour);

    マッチング文字列が間違っていました。対応が遅くなり、ごめんなさい。
    kn1967さん、ご指摘をありがとうございました。
  • id:tail_furry
    ポイントを割り振りました。みなさんどうもありがとうございました。
    pahooさんとkn1967さんの回答を足して巧くいったため、バッチリの回答がないということで、いるか賞はありません。
    ツッコミを入れると、pahooさんからいただいたコメントですが、質問に「括弧は半角括弧なので」と書いてあるにもかかわらず全角括弧になってますね・・・
    pahooさんとkn1967さんに全体の7/16ずつ、y-kawazさんはmb_ereg_replaceを使っていないということで1/8を割り振りました。
  • id:kn1967
    質問文から、相当のスキルはお持ちで、なぜか正規表現に躓いて
    一人で悩んでいても判らなくなるから人に聞いてみた・・・。

    そういう状況を想像して、正規表現だけに回答を絞ったのですが・・・。

    まだまだ状況の読みが浅いですね・・・。反省です。

    ポイント割り振りに関してまで、ご返答いただきありがとうございます。

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

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

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

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