2016-05-02 6 views
2
M3AAWG(メッセージング、マルウェアやモバイル濫用防止作業部会)は、「Unicodeの乱用防止のためのベストプラクティス」の手順を配信

PHPの正規表現

私は、このチェックを実装する:ユーザ名フィールド(PHP)は、この条件を満たしている:

All characters in each identifier must be **from a single script** or from the combinations: 
- Latin + Han + Hiragana + Katakana 
- Latin + Han + Bopomofo 
- Latin + Han + Hangul 

組み合わせ部分はコードに簡単に思えますが:

$nonLatinHanHiraganaKatakana = preg_match_all('/[^\\p{Common}\\p{Latin}\\p{Han}\\p{Hiragana}\\p{Katakana}]/u', $value); 
$nonLatinHanBopomofo = preg_match_all('/[^\\p{Common}\\p{Latin}\\p{Han}\\p{Bopomofo}]/u', $value); 
$nonLatinHanHangul = preg_match_all('/[^\\p{Common}\\p{Latin}\\p{Han}\\p{Hangul}]/u', $value); 

// If none of the allowed combinations by M3AAWG, then reject 
if ($nonLatinHanHiraganaKatakana && $nonLatinHanBopomofo && $nonLatinHanHangul) 
{ 
    // REJECT 
} 

は、文字列は単一のスクリプトから来ているかどうかを確認する簡単な方法はありますか?

些細なスタッフは、それぞれのスクリプトを個別にチェックしているようですが、何百もあり、実用的ではなく、パフォーマンスの価値もありませんでした(つまり、{latin}、{greek}おそらく、「ユーザ名」の各文字を「スクリプト」にする方法があるのでしょうか?それで複数の文字があるかどうかを確認してください。

+1

すべての拡張: ' '〜\ pを{ラテン} + \ Z〜u'' \、すべてのハングルから:'' 〜\ \ pを{ハングル} + \ z〜u''など –

+0

1つのスクリプトが多すぎますので、実際には1人1人のスタッフが別々にマッチします。 – framontb

+1

なぜあなたはすべて同じ言語の文字であれば気になりますか?それがあなたに何を伝えますか? – sln

答えて

1

確かに彼らは ブローhardsのちょうど束ではありません。それらが標準の ベアラーの場合は、リストの の許可された組み合わせを提供するようにしてください。 は正規表現を構成するために使用できます。そして、 単一正規表現を作ることに何も問題はありません。

^(?>[\p{Latin}\p{Han}\p{Hiragana}\p{Katakana}]+|[\p{Latin}\p{Han}\p{Bopomofo}]+|[\p{Latin}\p{Han}\p{Hangul}]+)$

ラテン語から

^
(?> 
     [\p{Latin}\p{Han}\p{Hiragana}\p{Katakana}]+ 
    | 
     [\p{Latin}\p{Han}\p{Bopomofo}]+ 
    | 
     [\p{Latin}\p{Han}\p{Hangul}]+ 

    # Add as many as you need 
    # | \p{..} 
) 
$ 
+0

このようなリストは妥当なパフォーマンスの方法でここにあるすべてのブロック(https://en.wikipedia.org/wiki/Unicode_block)? – framontb

+0

@framontb - 建設、パフォーマンスは問題ではありません。本当に、それは単純なcut'nペーストです。文字列の中で単純なmath_はここでは基本的な集合です。>> = low && <= high'これは、文字クラスを一致させるときに行われるエンジンの実際の計算です。 U + 0080-U + 00FF、U + 0080-U + 00FF、U + 0100-U + 017F、U + 0180-U + 024Fは、[\ u0000- \ u024f]または\ p {ラテン} '.Jusそれは、結果が大きいことを意味するわけではありません。 – sln

+0

ひとつの '\ p {Latin} \ p {Han} \ p {ひらがな} \ p {Katakana}]クラスは、それが全ての場合に備えて個々のブロックをカバーします。だから、ええ、巨大な正規表現を作り、最も一般的なものを一番上に置きます。しかし、あなたがそれを試していないなら、あなたは決して知りません。言い換えれば、**速い方法はありません**。地球上のマジックは、正規表現エンジンが使用する基本的な数学を破ることはできません。しかし、エンジンは文字列のナビゲーション用にも設計されています。この組み合わせは、コードクラッジであなたや他の誰かができることより優れています。 – sln

0

文字列が1つのスクリプト? (...のみ{ラテン}、{ギリシャ}、などだった何の意味?

」のswitchを使用しますすべての」可能なオプション、すなわち:

<?php 
echo detectChars("例例")."\n"; 
echo detectChars("Χαίρετε")."\n"; 
echo detectChars("user345")."\n"; 

function detectChars($username){ 
$chars = "NOT ALLOWED"; 
switch(true){ 
case preg_match('/^\p{Common}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Common}"); 
    break; 
case preg_match('/^\p{Arabic}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Arabic}"); 
    break; 
case preg_match('/^\p{Armenian}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Armenian}"); 
    break; 
case preg_match('/^\p{Bengali}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Bengali}"); 
    break; 
case preg_match('/^\p{Bopomofo}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Bopomofo}"); 
    break; 
case preg_match('/^\p{Braille}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Braille}"); 
    break; 
case preg_match('/^\p{Buhid}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Buhid}"); 
    break; 
case preg_match('/^\p{Canadian_Aboriginal}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Canadian_Aboriginal}"); 
    break; 
case preg_match('/^\p{Cherokee}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Cherokee}"); 
    break; 
case preg_match('/^\p{Cyrillic}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Cyrillic}"); 
    break; 
case preg_match('/^\p{Devanagari}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Devanagari}"); 
    break; 
case preg_match('/^\p{Ethiopic}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Ethiopic}"); 
    break; 
case preg_match('/^\p{Georgian}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Georgian}"); 
    break; 
case preg_match('/^\p{Greek}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Greek}"); 
    break; 
case preg_match('/^\p{Gujarati}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Gujarati}"); 
    break; 
case preg_match('/^\p{Gurmukhi}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Gurmukhi}"); 
    break; 
case preg_match('/^\p{Han}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Han}"); 
    break; 
case preg_match('/^\p{Hangul}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Hangul}"); 
    break; 
case preg_match('/^\p{Hanunoo}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Hanunoo}"); 
    break; 
case preg_match('/^\p{Hebrew}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Hebrew}"); 
    break; 
case preg_match('/^\p{Hiragana}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Hiragana}"); 
    break; 
case preg_match('/^\p{Inherited}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Inherited}"); 
    break; 
case preg_match('/^\p{Kannada}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Kannada}"); 
    break; 
case preg_match('/^\p{Katakana}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Katakana}"); 
    break; 
case preg_match('/^\p{Khmer}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Khmer}"); 
    break; 
case preg_match('/^\p{Lao}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Lao}"); 
    break; 
case preg_match('/^\p{Latin}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Latin}"); 
    break; 
case preg_match('/^\p{Limbu}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Limbu}"); 
    break; 
case preg_match('/^\p{Malayalam}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Malayalam}"); 
    break; 
case preg_match('/^\p{Mongolian}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Mongolian}"); 
    break; 
case preg_match('/^\p{Myanmar}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Myanmar}"); 
    break; 
case preg_match('/^\p{Ogham}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Ogham}"); 
    break; 
case preg_match('/^\p{Oriya}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Oriya}"); 
    break; 
case preg_match('/^\p{Runic}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Runic}"); 
    break; 
case preg_match('/^\p{Sinhala}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Sinhala}"); 
    break; 
case preg_match('/^\p{Syriac}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Syriac}"); 
    break; 
case preg_match('/^\p{Tagalog}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Tagalog}"); 
    break; 
case preg_match('/^\p{Tagbanwa}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Tagbanwa}"); 
    break; 
case preg_match('/^\p{Tamil}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Tamil}"); 
    break; 
case preg_match('/^\p{Telugu}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Telugu}"); 
    break; 
case preg_match('/^\p{Thaana}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Thaana}"); 
    break; 
case preg_match('/^\p{Thai}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Thai}"); 
    break; 
case preg_match('/^\p{Tibetan}+$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Tibetan}"); 
    break; 
case preg_match('/^\p{Yi} +$/u', $username): 
    $chars = preg_replace('/\\\\p|\{|\}/m', '', "\p{Yi}"); 
    break; 
} 
return $chars; 
} 

出力:

Han 
Greek 
NOT ALLOWED 

Ideone Demo

+0

約250個の "スクリプト"がありますが、これは実用的ではありません。 – framontb

+0

POSIXクラスのリストに基づいて 'switch'を作成するスクリプトを作ってみませんか? –

+0

何百もの正規表現を評価するパフォーマンスはどうですか? – framontb