質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.55%

正規表現でヒットした部分だけ半角から全角にしたい

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 591

sakura_hana

Unity総合1位

A=123B=456
このような文字列を
「A=123」B=456
のような形に変換したいです。(上記は例です)

$str = preg_replace('/(A=\d{1,3})/', '「$1」', $str);
これで「A=123」B=456には出来ましたが、これを全角にするにはどうすればよいのでしょうか?
mb_convert_kanaを使えば全角にはなりますが、文字列内の全ての数字が全角になってしまいます。

文字列の条件は以下の通りとなります。
・「A=」が行頭に来るとは限らない。
・「A=」の後ろの数字は1〜3桁。半角か全角かは不定。
・「A=数字」の後ろは不定。(「B」であるかどうかは定かでない)
・元の文字列には半角数字も全角数字も含まれている可能性があり、「A=数字」以外の部分は元のままにする必要がある(半角/全角を変えてはいけない)。

preg_matchで取り出して、前後をカットして(3つの文字列にして)、ヒットした部分だけmb_convert_kanaをして、結合し直して1つの文字列にする……とすれば出来るのでしょうが、スマートではないのでもっと良い方法は無いかと質問させて頂きました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

$str="A=123B=456";
$pattern="/A=\d{1,3}/";
$replacement=function($x){return mb_convert_kana($x[0],"N");};
print preg_replace_callback($pattern,$replacement,$str);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

"A="を後読みして、

$str = "A=134B456";

$str = preg_replace_callback('/A=\K[0-90-9]{1,3}/',
        function($x){ return mb_convert_kana($x[0],'N'); },
        $str);

var_dump($str);


あるいは、括弧を使って、

$str = "A=134B456";

$str = preg_replace_callback('/A=([0-90-9]{1,3})/',
    function($x){ return "A=".mb_convert_kana($x[1],'N'); },
    $str);

var_dump($str);

追記

ああ、A=の全体を「」で囲むんですね。じゃあ、括弧ですね。

$str = "A=134B456";

$str = preg_replace_callback('/A=([0-90-9]{1,3})/',
    function($x){ return '「A='.mb_convert_kana($x[1],'N').'」'; },
    $str);

var_dump($str);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

文字クラスの中に全角文字入れるときはu修飾子をつけるのを忘れずに

u 修飾子を使用する目的

$str = "A=123B=456";
$str = preg_replace_callback(
    '/A=([\d0-9]{1,3})/u',
    function ($m) {
        return '「A=' . mb_convert_kana($x[1], 'N', 'UTF-8') . '」';
    },
    $str
);
var_dump($str);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.55%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る