PHP - 文字列

トリミング

ユーザ入力のバリデーションで、最後にスペースが入っているだけでいちいち「URLに使用できない文字が入っています」のようなエラー文を出さないよう事前にトリミングとか。
※ 以下の関数はPHP4・UTF-8だとうまく置換できません。対応は暇な時にやります・・・。

<?php

/**
 * ■■■マルチバイト左トリミング■■■
 *
 * 全角スペースを含めて左トリミング
 *
 * @param    mixed    $item        対象文字列 or 格納配列
 * @return    mixed            変換後文字列 or 格納配列
 */

function STR_mb_ltrim($item)
{
    if(
is_array($item)){return array_map('STR_mb_ltrim'$item);}
    return 
mb_ereg_replace("^[\s ]+"""$item);
}



/**
 * ■■■マルチバイト右トリミング■■■
 *
 * 全角スペースを含めて右トリミング
 *
 * @param    mixed    $item        対象文字列 or 格納配列
 * @return    mixed            変換後文字列 or 格納配列
 */

function STR_mb_rtrim($item)
{
    if(
is_array($item)){return array_map('STR_mb_rtrim'$item);}
    return 
mb_ereg_replace("[\s ]+$"""$item);
}



/**
 * ■■■マルチバイトトリミング■■■
 *
 * 全角スペースを含めてトリミング
 *
 * @param    mixed    $item        対象文字列 or 格納配列
 * @return    mixed            変換後文字列 or 格納配列
 */

function STR_mb_trim($item)
{
    if(
is_array($item)){return array_map('STR_mb_trim'$item);}
    return 
STR_mb_rtrim(STR_mb_ltrim($item));
}

?>

英数読み仮名取得

IDっぽいものをメールでお知らせする時に、「l(エル)」と「1(イチ)」を間違ったりしないように読み仮名が付いていたりしますね。

<?php
class STR
{
    
/**
     * ■■■英数読み仮名取得
     * @example    $passwd_ruby = STR::getRubyAlnum($passwd);
     * @date    2010-12-28
     * @param    int    $str        半角英数文字列
     * @param    string    $separator    セパレーター(デフォルト:'・')
     * @return    array            読み仮名(例:'エイ・ビー・シー・ゼロ・イチ')
     */
    
public static function getRubyAlnum($str$separator '・')
    {
        
$alnum_array = array(
                
'A''B''C''D''E''F''G''H''I''J''K''L''M''N',
                
'O''P''Q''R''S''T''U''V''W''X''Y''Z',
                
'0''1''2''3''4''5''6''7''8''9'
                
);

        
$ruby_array = array(
                
'エイ''ビー''シー''ディー''イー''エフ''ジー',
                
'エイチ''アイ''ジェイ''ケイ''エル''エム''エヌ',
                
'オー''ピー''キュー''アール''エス''ティー''ユー',
                
'ブイ''ダブリュ''エックス''ワイ''ゼット',
                
'ゼロ''イチ''ニ''サン''ヨン''ゴ''ロク''シチ''ハチ''キュウ'
                
);

        
$dst_array = array();
        
$str_array str_split($str);
        foreach (
$str_array as $char) {
            
$pos array_search(strtoupper($char), $alnum_arraytrue);
            if (
$pos !== false) {
            }
        }

        return 
implode($separator$dst_array);
    }
}
?>

伏字に置換

NGワードを隠したり。使った覚えが無いので動くか。

<?php
class STR
{
    
/**
     * ■■■伏字に置換
     * @example    $msg = STR::mask($msg, array('バカ', '氏ね'));
     * @date    2012-08-23
     * @param    string        $str        対象文字列
     * @param    string|array    $search        置換対象文字列 or 格納配列(指定されればこの文字のみ伏字に置換)
     * @param    string        $mask_char    伏字用文字
     * @return    string                置換後文字列
     */
    
public static function mask($str$search null$mask_char "*")
    {
        if (empty(
$search)) {
            
$search = array();
        } else {
            
$search = (array) $search;
        }

        if (
$search) {
            
$replacements = array();
            foreach (
$search as $token) {
                
$replacements[] = str_repeat($mask_charmb_strlen($token));
            }
            return 
str_replace($search$replacements$str);
        } else {
            return 
str_repeat($mask_charmb_strlen($str));
        }
    }
}
?>

50音行取得

「あかさたな・・・」別にデータを分けたい場合に使用する関数。

<?php
/**
 * ■■■50音行取得■■■
 *
 * 50音に濁音、半濁音、促音、捨て仮名(小文字)も加えている。
 * @param    string    $str        対象文字列
 * @param    bool    $result_type    取得形式(true:行番号 false:行頭文字)
 * @param    bool    $n_flg        「ん行」使用フラグ(true:使用 false:"ん"は「その他」にする)
 * @param    mixed    $other_str    「その他」時に返す文字(文字で返す場合。デフォルト:"その他")
 * @return    mixed            行番号(0~11(0は「その他」))or 行頭文字("あ"~"ん"・"その他")
 */

function GET_50on_row($str$result_type=true$n_flg=false$other_str=false)
{
    
//■50音配列設定
    
$on50_array = array(
            array(
"あ","い","う","え","お","ぁ","ぃ","ぅ","ぇ","ぉ"),
            array(
"か","き","く","け","こ","が","ぎ","ぐ","げ","ご"),
            array(
"さ","し","す","せ","そ","ざ","じ","ず","ぜ","ぞ"),
            array(
"た","ち","つ","て","と","だ","ぢ","づ","で","ど","っ"),
            array(
"な","に","ぬ","ね","の"),
            array(
"は","ひ","ふ","へ","ほ","ば","び","ぶ","べ","ぼ","ぱ","ぴ","ぷ","ぺ","ぽ"),
            array(
"ま","み","む","め","も"),
            array(
"や","ゆ","よ","ゃ","ゅ","ょ"),
            array(
"ら","り","る","れ","ろ"),
            array(
"わ","ゐ","ゑ","を","ゎ")
            );

    
// 「ん行」使用なら追加
    
if($n_flg){$on50_array[] = array("ん");}

    
//■対象文字列の1文字目取得
    
$first_str mb_substr($str01);

    
//■カタカナ→ひらがな
    
$first_str mb_convert_kana($first_str"KVc");

    
//■50音配列を検索
    
$row_num false;
    foreach(
$on50_array as $k => $row_array){
        if(
in_array($first_str$row_array)){
            
$row_num $k 1;        // 行番号("あ"は1)
            
break;
        }
    }

    
//■50音時
    
if($row_num !== false){return $result_type $row_num $on50_array[$k][0];}

    
//■50音以外(その他)時
    
if($result_type){
        
// 行番号で返す場合
        
return 0;
    }else{
        
// 行頭文字で返す場合
        
return ($other_str === false) ? "その他" $other_str;
    }
}
?>

GET_50on_row()の使用例。

<?php
$str1 
"ネコマンマ";
$str2 "んーまんだむ";
$str3 "aたたたたた";

echo 
"文字列:{$str1}<br />";
echo 
"行番号:".GET_50on_row($str1)."<br />";
echo 
"行頭文字:".GET_50on_row($str1false)."<br /><br />";

echo 
"文字列:{$str2}<br />";
echo 
"行番号:".GET_50on_row($str2)."<br />";
echo 
"行頭文字(デフォルト):".GET_50on_row($str2false)."<br />";
echo 
"行頭文字(「ん行」使用):".GET_50on_row($str2falsetrue)."<br /><br />";

echo 
"文字列:{$str3}<br />";
echo 
"行番号:".GET_50on_row($str3)."<br />";
echo 
"行頭文字(デフォルト):".GET_50on_row($str3false)."<br />";
echo 
"行頭文字(その他文字指定):".GET_50on_row($str3falsefalse"スカ");
?>
文字列:ネコマンマ
行番号:5
行頭文字:な

文字列:んーまんだむ
行番号:0
行頭文字(デフォルト):その他
行頭文字(「ん行」使用):ん

文字列:aたたたたた
行番号:0
行頭文字(デフォルト):その他
行頭文字(その他文字指定):スカ