2

PHP の preg_replace を使用して、文字列の末尾から英数字以外の文字を削除する必要があります。

Word One, Two, -Word One, Two,[space]Word One, Two,Word One, TwoすべてになるはずWord One, Twoです。

私は試しpreg_replace('/(.+)\\W+$/', '$1', 'Word One, Two, -');ましたが、これは単語以外の最後の文字のみを取り除きます。また、単語以外の文字が 0 個または 1 個見つかった場合 (必要に応じて)、これが機能すると想定して試し'/(.+)\\W*$/'てみましたが、まったく一致しませんでした。貪欲にする必要があると思いますが、\W方法がわかりません。何か案は?また、SO 正規表現タグに悩まされないように、私が間違っていることをお気軽に説明してください;-)

4

2 に答える 2

2

これは、(.+)単語以外の文字を含む他のすべての文字を消費するためです。正規表現エンジンは文字列の照合を開始し、キャプチャ グループ内のすべての文字から開始します。\Wその後、文字列の末尾にある が収まらないことに気付き、バックアップして、一時的に\W. しかし、 を満たすために必要なのは 1 文字\W+だけなので、停止してその 1 文字を削除するだけです。何も一致しないことに満足しているため、それ(.+)\W*$がまったく機能しない理由でもあります。\W*

使用する

preg_replace('/\\W+$/', '', $foo);

代わりは。これにより、他の何かと一致させようとせずに、末尾の単語以外の文字を置き換えるだけで問題が回避されます。

別のオプションは

preg_replace('/(.+?)\\W+$/', '$1', $foo);

これは、キャプチャ グループに遅延量指定子 ( ) を使用します。+?この量指定子は、一致をできるだけ少なくして一致を満たそうとします (上で見たように、可能な限り+一致させようとするのとは対照的です)。しかし、一般的に、マッチの一部を自分で置き換えることは避けたいと思います。文字列から何かを取り除くために、必要以上に一致させる必要はありません。

于 2012-06-15T09:34:18.063 に答える
1

正規表現が行っているのは、最後に少なくとも 1 つの非単語を保持しながら、任意の文字の可能な最大量を探すことです。

あなたがする必要があるのは、単にドロップして(.+)使用することです:

preg_replace("/\W+$/","",$input);
于 2012-06-15T09:33:59.107 に答える