正規表現: 2007年7月アーカイブ

正規表現関数とパターン修飾子 u

正規表現関数 にて、UTF-8 での処理を有効にするパターン修飾子 u を使うと、Unicode のカテゴリが使用できるというお話。

文章的に意味がなさそうな文字列を判別しちゃう(サイコロを振るよりはマシ程度)

$strings = array(
        '0123456789',
        'Latin',
        'ひらがな',
        'カタカナ',
        '漢字',
        '한글',
        'αβγ',
        '+-*/=<>', 
        '「」()『』',
        pack('C*', 0xe2, 0x80, 0x8b), // U+200B (Zero Width Space) 
    );

foreach ($strings as $string)
{
    $hasLetter = preg_match('/\\p{L}/u', $string);
    printf('"%s" has letter? %s' . "\r\n", $string, $hasLetter ? 'Yes' : 'No');
}



// "0123456789" has letter? No
// "Latin" has letter? Yes
// "ひらがな" has letter? Yes
// "カタカナ" has letter? Yes
// "漢字" has letter? Yes
// "한글" has letter? Yes
// "αβγ" has letter? Yes
// "+-*/=<>" has letter? No
// "「」()『』" has letter? No
// "​" has letter? No
 

絵文字の変換

// U+E000 ~ U+E8FF までのブロックは Private Use Area

function pictographToText($capture)
{
    $table = array(
            pack('C*', 0xee, 0x98, 0xbe) => '晴れ', // U+E63E (i-mode 基本絵文字 "晴れ")
            pack('C*', 0xee, 0x98, 0xbf) => '曇り', // U+E63F (i-mode 基本絵文字 "曇り")
            pack('C*', 0xee, 0x99, 0x80) => '雨',   // U+E640 (i-mode 基本絵文字 "雨")
        );

    return isset($table[$capture[0]]) ? $table[$capture[0]] : '?';
}


$string = '今日の天気は '
    . pack('C*', 0xee, 0x98, 0xbe)
    . ' です。'
    . '明日の天気は '
    . pack('C*', 0xee, 0x99, 0x80)
    . ' かも?';

echo preg_replace_callback('/\\p{Co}/u', 'pictographToText', $string);


// 今日の天気は 晴れ です。明日の天気は 雨 かも?

参考

このアーカイブについて

このページには、2007年7月以降に書かれたブログ記事のうち正規表現カテゴリに属しているものが含まれています。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

正規表現: 2007年7月: 月別アーカイブ

Powered by Movable Type 4.12