2

フォームの textarea フィールドに入力されたロシア語のテキスト (utf8) を検証する必要があります。文字数 (スペースや空行を含まない) は 500 以上である必要があります。テキストは正規表現でチェックする必要があり、多くの行を含めることができます。

私が試してみました:

#^.{500}.*#

これは確かにどういうわけか制限を作ります。ただし、このパターンは unicode を尊重していないようです。ロシア語の文字は 260 文字あれば十分です。次の方法がわかりません。

  1. ユニコード文字をチェック
  2. 空白を数えない
  3. 空行を数えない
4

3 に答える 3

1

入力文字列は ASCII として解釈されるため、最初.にデフォルトでバイトに一致します。Unicodeモードを使用すると、(Esailjaが正しく指摘したように)それが変更されるため、.(Unicode)文字に正しく一致します。

#^.{500}#u

.*PHP では完全な文字列に一致させる必要がないため、末尾の は必要ありません。は改行と一致しないため、最初の 500 文字以内に改行がある場合は一致しないことに注意してください(これを変更するには、修飾子も.追加する必要があります)。s

カウントから空白を除外する 2 番目の要件については、次のようにすることができます。

#^(?:\s*\S){500}#u

そのサブグループは、できるだけ多くのスペース文字に一致し、次に 1 つの非スペース文字に一致します。そして、それを合わせて 500 回一致させる必要があります。したがって、必要に応じて、空白以外の文字 1 つにつき 1 つの繰り返ししか得られません。

sを使用しないため、すべての状況でこれが機能するために修飾子が必要ないことに注意してください.

ただし、この記事で説明されている注意点が 1 つあります。Unicode では、一部の文字が複数のコード ポイントで構成されています。たとえば、à1 つの文字の後に結合記号であるa別のコード ポイント (U+0300または) が続くように記述できます。`したがって、2 つの異なる Unicode コード ポイントがありますが、それらは 1 つの文字にすぎません。ただし、.コード ポイントに一致します (結合マークと「スタンドアロン文字」を区別しないため)。キリル文字はアクセントを使用しないため、状況に影響はないと思います。しかし、それは知っておく価値のあることです。あなたに関連する場合は、Ωmega のようなより高度なソリューションを検討することをお勧めします。

于 2012-11-26T22:09:04.923 に答える
1

関数uで UTF-8 認識を有効にするには、フラグが必要です。preg_

$regex = '#^.{500}.*#u';

長さが 500 文字かどうかを確認したいだけの場合は、次のように使用できます。mb_strlen:

mb_internal_encoding("UTF-8");
$input_without_whitespace = preg_replace( '/[\x{0009}\x{000B}\x{000C}\x{0020}\x{00A0}\x{FEFF}\x{200C}\x{200D}]/u', "", $input );
if( mb_strlen( $input_without_whitespace ) > 500 ) {

}
于 2012-11-26T22:00:55.767 に答える
0

正規表現パターンを使用

/(?>\s*+\P{M}\p{M}*){500}/u
于 2012-11-26T22:18:28.097 に答える