LoginSignup
1
1

More than 5 years have passed since last update.

文字列中の特定文字を処理した後に置換する

Posted at

「文字列中に含まれるローマ字をDB上のものと照合して漢字に変換したい」と考えてコードを書きました。他に例が見当たらなかったので上げておきます。

ローマ字を変換しているといっても、文字列から取得していうるのは英字なので、DBの処理の箇所を別の処理に変更すれば他の使い方もできそうです。また、正規表現の箇所を変えれば他の応用もできると思います。

 <?php

require_once("dsn.php");

function romajiConvert($str) {

  // 文字列内に英字が含まれる場合
  if (preg_match("/[a-zA-Z]+/", $str)) {

    // 文字列内に含まれる英字を取り出す
    preg_match_all("/[a-zA-Z]+/", $str, $out, PREG_PATTERN_ORDER);
    $alphabet = $out[0];
    $replace = array(); // 置換用配列

    foreach ($alphabet as $az) {

      // ここからDBの処理
      // DBの地名ローマ字データと照合し、漢字に変換する
      // e.g. Tokyo -> 東京都
      global $dsn;
      $db = new PDO($dsn['host'], $dsn['user'], $dsn['pass']);
      $db->exec('SET NAMES utf8');
      $db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
      $sql = "SELECT kanji FROM romaji_convert "
            . "WHERE LOWER(hebon)=LOWER(:romaji) OR LOWER(kunrei)=LOWER(:romaji)";
      $stt = $db->prepare($sql);
      $stt->bindValue(":romaji", $az, PDO::PARAM_STR);
      $stt->execute();
      $response = $stt->fetch(); 

      // DBにデータがあった場合はそれを、なかった場合は元の値を入れる
      // (str_replaceで使うため)
      if (!empty($response['kanji'])) {
        $replace[] = $response['kanji'];  
      } else {
        $replace[] = $az;
      }
    }

    // str_replace($search, $replace, $subject)
    // において、$search と $replace が配列の場合は順に置換が行われる
    // http://php.net/manual/ja/function.str-replace.php
    // e.g. 
    //    $subject = "nya wan chun";
    //    $search = ["nya", "chun"];
    //    $replace = ["にゃ", "ことりちゃん!"];
    //    $out = str_replace($search, $replace, $subject);
    //    echo $out;
    //    --- 出力結果 ---
    //    "にゃ wan ことりちゃん!"
    $str = str_replace($alphabet, $replace, $str);
  }

  return $str;
}

?>
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1