2012-02-17 5 views
16

私はすでに作業用コードを持っていますが、もし可能ならばなぜ機能するのかを説明する人が必要です!英数字、カンマ、ハイフン、アンダースコア、およびセミコロンのみを許可するRegex

az、AZ、0-9、コンマ、セミコロン、アンダースコア、またはハイフン(最終的には単一のユーザ名を表すはずです)の文字列をPHPで置換しています。ユーザー名のコンマ/セミコロン区切りリスト)。

次作品:

$data = preg_replace('/[^,;a-zA-Z0-9_-]/s', '', $data); 

しかし、次はしていません:

$data = preg_replace('/[^a-zA-Z0-9_-,;]/s', '', $data); 

なぜでしょうカンマやセミコロンは開始時にあるこののみ動作しますか?それらを最後に置くと事態が悪化するようです(これは/ [^ a-zA-Z0-9 _-]/sに出会ったときに最初に試したものです)

脇に、任意の末尾セミコロン(複数)またはカンマ(複数)をトリミングして、誰かがこれを行うには、より効率的かつ/またはエレガントな方法を提案することができるかもしれすることは任意の助け

if(preg_match('/;$/', $data)) 
{ 
    $data = rtrim($data, ';'); 
} 
if(preg_match('/,$/', $data)) 
{ 
    $data = rtrim($data, ','); 
} 

感謝:)

答えて

27

問題を引き起こすのはカンマとセミコロンではありません。それはハイフンです。あなたの文字クラスの部分を見て、彼らが何を意味するか考えてみます。

0-9 # Anything from '0' to '9', meaning 0, 1, 2, ... 9 
A-Z # Anything from 'A' to 'Z', meaning A, B, C, ... Z 
_-, # Anything from '_' to ',', meaning...uh...hmmm. 

_から,に明確な進展はありませんので、正規表現エンジンはこれを何をするかわからないです。文字クラスでは、ハイフンを文字通りに解釈するには、クラスの最初または最後にハイフンを挿入する必要があります(またはバックスラッシュでエスケープします)。したがって、これらのいずれかが動作します:

[^,;a-zA-Z0-9_-] 
[^-,;a-zA-Z0-9_] 
[^a-zA-Z0-9_\-,;] 

端をトリミングするためとして、あなたはこのすべてを行うことができます1つの正規表現に置き換える:

$data = preg_replace('/[^,;a-zA-Z0-9_-]|[,;]$/s', '', $data); 
+0

_ '〜'、 '' _:非常に明確な進展があります。これはUnicodeテーブルに基づいています。しかし、この場合、 '_'はUnicodeテーブルの_after_'、 'になります。そのため、範囲指定はできません。 – Xufox

+0

@Xufox - それはそれを回帰にしてくれるでしょうか? ;)ポイントは、正規表現エンジンが理解する進歩はないということです。しかし、あなたは正しく、[他の方向への有効な進展があることは明らかです(http://rextester.com/YGC93292)、 '、'から '_ 'になります。私は今までそれを知らなかった、ありがとう! –

2
を?:します

私はそれが重要であるハイフンの配置だと思います。ハイフン(リテラル)にするには開始または終了する必要があります。それ以外の場合は範囲​​を定義するために使用されています。

+0

1をまた、あなたは、単にバックスラッシュにを使用することができることに注意してください2番目のパターンで不正なハイフンをエスケープすると、最初のパターンと同じように動作します: '/ [^ a-zA-Z0-9 _ \ - 、]/s'' – rdlowrey

1

あなたは末尾のセミコロンとカンマについては、この/[,;]+$/が、それは彼らが多くの場合であっても最後にカンマやセミコロンと一致する必要がありますしようとハイフンをエスケープし、この\-

のような正規表現のどこにそれを置くことができます。

関連する問題