2010-12-28 14 views

答えて

34

デフォルトでは、.は改行と一致しません。[\s\S]はその問題のハックです。
これはJavaScriptで一般的ですが、PHPでは/sフラグを使用して、ドットをすべての文字に一致させることができます。

+0

常に 's'修飾子があります... – BoltClock

+0

' .'はいつ新しい行にマッチしますか? – yoyo

+0

@BoltClock - ありがとう、私はちょうどそれに到達した、ちょうどそれがPHPで行われている方法を確認していた。 – Kobi

15

.メタ文字は、改行以外のすべての文字に一致します。したがって、一致するように使用されているパターン.*は、改行をうまく一致させる必要がある場合には機能しません。改行を含む任意のの文字がそう[\d\D][\w\W]を行う空白文字および非空白文字の文字クラスがある

preg_match('/^.*$/',"hello\nworld"); // returns 0 

[\s\S]が一致します。したがって、あなたのパターン[\s\S]*は今何でも一致します。

preg_match('/^[\s\S]$/s',"hello\nworld"); // returns 1 

(改行を含む).マッチ何かを作るための代替はs修飾子を使用することです。 sモードをオンとオフの場合(?-s)ターン

preg_match('/^(?s).*(?-s)$/',"hello\nworld"); // returns 1 

(?s):インライニングとしてs改質剤を使用する

preg_match('/^.*$/s',"hello\nworld"); // returns 1 

代替方法です。一度オフにすると、.は改行と一致しません。

+0

最後のビットは隣接する '.'の動作だけを変更しますか?私は前にその構文を見ていない。 – BoltClock

+0

@BoltClock - インラインでフラグを設定したりクリアしたりすることができます。クリアするまで、すべての点に有効です: '(?smi)。* abc(? - smi)* aBc' – Kobi

+0

@Kobi:ああ、本当にクールです! – BoltClock

1

[\s\S]改行を含む任意の文字に一致する文字セット。

.改行以外の文字に一致します。

関連する問題