2011-09-29 39 views
0

我需要一個正則表達式模式,它檢查字符串是否包含除W,w,P,p之外的字母。PHP正則表達式除了W,W,P,p

$pattern = ''; // I need this pattern 
preg_match($pattern, '123123'); // false 
preg_match($pattern, '123123a'); // true 
preg_match($pattern, '123123W'); // false 
preg_match($pattern, '123123w'); // false 
preg_match($pattern, '123123P'); // false 
preg_match($pattern, '123123p'); // false 
preg_match($pattern, '123123WwPp'); // false 
preg_match($pattern, 'abcWwPp'); // true 
preg_match($pattern, 'abc'); // true 

在此先感謝您。

+2

「letter」的意思是_only_是ASCII字母[A-Za-z]嗎? –

+0

是的,只有a-z和A-Z – pltvs

回答

4

如果你只關心ASCII字母,檢查

[^\W\d_WP] 

,使搜索不區分大小寫:

preg_match('/[^\W\d_WP]/i', $subject) 

[^\W\d_WP]一個字符,字母數字,從其減去的數字匹配,下劃線,W和允許字符列表中的P[^\W]看起來不符合直覺,因爲它意味着「不是非字母數字字符」,但是雙重否定的回報會帶來回報,因爲我可以從結果中減去其他字符。

如果你關心Unicode字母,使用

preg_match('/[^\PLWP]/iu', $subject) 

\PL匹配,是不是一個Unicode字母(的\pL對面)

3

搜索範圍之外的任何字母W和P - 這樣的

/[a-oq-vx-z]/i 

注意i末不區分大小寫

+0

好主意。它避免了我答案的倒退邏輯;那麼你又必須看兩次才能找出哪些字符是不允許的。 –

+0

礦是更容易理解,罰款沒有unicode,你的符號在變音符號和口音可以用作匹配字母。 –

1

這不是一個答案,而是一個檢查Tim Pietzcker表達式的小程序:它根據Billy提供的測試工作。

<?php 

error_reporting(E_ALL); 
$pattern = '/[^\W\d_WP]/i'; 

assert(!preg_match($pattern, '123123')); 
assert(preg_match($pattern, '123123a')); 
assert(!preg_match($pattern, '123123W')); 
assert(!preg_match($pattern, '123123w')); 
assert(!preg_match($pattern, '123123P')); 
assert(!preg_match($pattern, '123123p')); 
assert(!preg_match($pattern, '123123WwPp')); 
assert(preg_match($pattern, 'abcWwPp')); 
assert(preg_match($pattern, 'abc')); 

?>