PHPでカタカナを半角変換したいと思っています。

普通の文字は問題ないのですが、長音記号が引っかかっています。

たとえば
ゴール → ゴール
ごーる → ごーる
というように長音記号はひらがなでありかたかなであるために、単純に一括返還すると
ごーるのようにひらがなの中の長音も変換されてしまいます。

とても一般的な悩みだと思いますが、検索してもいい解決方法が見つかりませんでした。
方法を教えてください。

回答の条件
  • 1人2回まで
  • 登録:2008/07/10 14:53:27
  • 終了:2008/07/11 08:04:24

ベストアンサー

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/07/10 15:41:36

ポイント50pt

まず、長音記号の変換ルールの確定させてください。

直前文字がカタカナの場合、カタカナの長音記号とみなし、半角に変換する。

というルールでよろしいでしょうか。


であれば、以下のような関数で変換できます。

引数は変換したい文字列、戻値は変換後の文字列です。

ただし、この関数内では文末判定は行っていないので、文末まで(1行分)を引数としてください。

function katakana2han($instr) {
    $flag = FALSE;    //直前文字がカタカナならTRUE
    $len = mb_strlen($instr);
    $ofst = 1;
    $outstr = '';
    for ($ofst = 0; $ofst < $len; $ofst++) {
        $ch = mb_substr($instr, $ofst, 1);
        if ($ch == 'ー') {
            if ($flag)  $outstr .= 'ー';
            else        $outstr .= $ch;
        } else if (mb_ereg_match('[ァ-ヶ]+', $ch)) {
            $outstr .= mb_convert_kana($ch, 'k');
            $flag = TRUE;
        } else {
            $outstr .= $ch;
            $flag = FALSE;
        }
    }
    return $outstr;
}
id:dingding

ありがとうございます!

ちなみにこれは

「きたーーーーーー」は変換しないで、「キターーーー」は返還するのでしょうか?

2008/07/10 16:08:11

その他の回答(1件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332008/07/10 15:41:36ここでベストアンサー

ポイント50pt

まず、長音記号の変換ルールの確定させてください。

直前文字がカタカナの場合、カタカナの長音記号とみなし、半角に変換する。

というルールでよろしいでしょうか。


であれば、以下のような関数で変換できます。

引数は変換したい文字列、戻値は変換後の文字列です。

ただし、この関数内では文末判定は行っていないので、文末まで(1行分)を引数としてください。

function katakana2han($instr) {
    $flag = FALSE;    //直前文字がカタカナならTRUE
    $len = mb_strlen($instr);
    $ofst = 1;
    $outstr = '';
    for ($ofst = 0; $ofst < $len; $ofst++) {
        $ch = mb_substr($instr, $ofst, 1);
        if ($ch == 'ー') {
            if ($flag)  $outstr .= 'ー';
            else        $outstr .= $ch;
        } else if (mb_ereg_match('[ァ-ヶ]+', $ch)) {
            $outstr .= mb_convert_kana($ch, 'k');
            $flag = TRUE;
        } else {
            $outstr .= $ch;
            $flag = FALSE;
        }
    }
    return $outstr;
}
id:dingding

ありがとうございます!

ちなみにこれは

「きたーーーーーー」は変換しないで、「キターーーー」は返還するのでしょうか?

2008/07/10 16:08:11
id:taku_j_7 No.2

taku_j_7回答回数139ベストアンサー獲得回数122008/07/10 16:08:13

ポイント20pt

面倒な処理を入れなくとも、関数がありますのでこれを使うと良いと思います。

「mb_convert_kana」

$hoge = mb_convert_kana($hoge, "k");

参考サイト

http://phpspot.net/php/man/php/function.mb-convert-kana.html

  • id:pahoo
    #1で回答した者です。

    > 「きたーーーーーー」は変換しないで、「キターーーー」は返還するのでしょうか?

    はい。その通り変換します。

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

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

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

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