入力文字列は 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 のようなより高度なソリューションを検討することをお勧めします。