質問

の答え:

"正規表現検出する番号の書き言葉として":

正規表現検出する番号の書き言葉として

今のこの仕事をしていを同じ要件が、数字と単語(アラビア語やその他UTF-8)となん:

if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/", $str, $matches) > 0) 
   return true;

動作しない-私ンターネットで調べやがあるようでかなりの数の問題preg_match UTF-8文字列からなかったものの提案は見つかります。協力をよろしくお願いいたします。

役に立ちましたか?

解決

あなたが期待するよう\bが動作していないことを

注。 \b指定A 単語境界のが、何PCREによって単語文字と見なされることは何に依存しますスクリプトが実行されているロケール( PCREの底部に向かっ見てみましょう

:エスケープシーケンスは、マニュアルページ)を
  

A「単語」の文字が任意の文字や数字や、Perlの「単語」の一部とすることができる任意の文字で下線文字、です。文字と数字の定義は、PCREの文字テーブルにより制御され、ロケール固有のマッチングが行われている場合は異なる場合があります。たとえば、「FR」(フランス語)ロケールで、128よりも大きい一部の文字コードがアクセント付き文字のために使用されており、これらは、ワット\で一致しています。

また、取り扱いUTF-8 PHP を持つ(読みたいと思うかもしれません特に、PCREのセクション)。

その代わり、あなたが使用することができます前後参照のUnicode文字プロパティにと一緒に(?<=\P{L}):境界言葉をエミュレートします。これは、前の文字が のないUnicodeの "文字" であると主張します。

だから、すべて一緒に、それは次のようになります。

/(?<=\P{L})(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\s*?){4}/

他のヒント

(必要な場合)、再度$strアイテムを変換し、マッチングを行う、windows-1256にパターンと$matchesの両方を変換し、これは、私はいくつかの時間のため苦しみの後に来たソリューションです。

$pattern="/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/";
$pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern);
$str_windows1265 = iconv('utf-8', 'windows-1256', $str);
if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) 
   return true;
ここでUnicode変換がアラビア語の文字を許可されるかどうかを確認するpreg_matchに一致する試験例です。

<?php
$pattern="/(واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)/";
$pattern_windows1265 = iconv('utf-8', 'windows-1256', $pattern);


$test_cases=array(
    'لدي أربعة أولاد',
    'قفز الثعلب فوق الشجرة',
    'عندي خمسة أرانب',
);
foreach ($test_cases as $str) {
    $str_windows1265 = iconv('utf-8', 'windows-1256', $str);

    if (preg_match($pattern_windows1265, $str_windows1265, $matches) > 0) {
        echo $str, '<br />';
    }
}

実行する際に、それの出力は以下となります:

لدي أربعة أولاد
لدي خمسة أرانب

私はアラビア語に対する無地チェックが動作しているようだこれは、働くかどうかを確認するために、パターンの一部を削除します。

利用できるパターンの修飾 u 使用UTF-8対応言語です。

if (preg_match("/\p{L}\b(?:(?:واحد|اثنان|ثلاثة|أربعة|خمسة|ستة|سبعة|ثمانية|تسعة|صفر|عشرة)\b\s*?){4}/u", $str, $matches) > 0) 

資源

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top