2013-06-09 4 views
1

Вот мой код:Как использовать preg_match для соответствия всем, кроме чисел в PHP?

//Validate names have correct characters 
if (preg_match("/^[a-zA-Z\s-]+$/i", $_POST['first']) == 0) { 
    echo '<p class="error">Your first name must only include letters, 
     dashes, or spaces.</p>'; 
    $okay = FALSE; 
} 

if(preg_match("/^[a-zA-Z\s-]+$/i", $_POST['last']) == 0) { 
    echo '<p class="error">Your last name must only include letters, 
     dashes, or spaces.</p>'; 
    $okay = FALSE; 
} 

Как изменить этот код так, что он принимает все, кроме цифр?

+3

'\ D' или' [^ 0-9] ' –

ответ

2

Ведран был наиболее правильным. \d означает цифры, а капитал \D означает NOT цифры. Таким образом, у вас было бы:

if (preg_match("/\d/i", $_POST['first']) > 0) { 
    echo '<p class="error">Digits are not allowed, please re-enter.</p>'; 
    $okay = FALSE; 
} 

Вышеуказанное означает ... Если вы найдете какую-либо цифру ... сделайте свою ошибку. aka: разрешить все, кроме цифр.

ОДНАКО ... Я считаю, что вам нужно переосмыслить свою идею, чтобы позволить «Все кроме цифр». Обычно вы не хотите, чтобы пользователь вводил котировки или специальные символы ACII, но, похоже, вы хотите, чтобы они могли вводить [email protected]#$%^&*()_+=|}{\][:;<>?,./~

Это похоже на длинный список, но по сравнению с полным списком возможных символов он это не так долго. Поэтому, даже если кажется, что больше работы, вы можете сделать это:

if (preg_match("/[^-~`[email protected]#$%^&*()+={}|[]\:;<>?,.\w]/i", $_POST['first']) > 0) { 
echo '<p class="error">ASCII and Quotes are not accepted, please re-enter.</p>'; 
$okay = FALSE; 
} 

Ни один из них имеет начало/конец-Line специальные символов, потому что вы ищете где-нибудь в строке для любого вхождения в (или нет) этих проверок.

Я изменил оператор сравнения на (если больше), потому что мы не ищем недостатка в чем-то, что требуется для того, чтобы выпустить ошибку, мы ищем существование чего-то плохого, чтобы выбросить ошибку.

Кроме того, я взял подчеркивание из последнего регулярного выражения ... потому что символ слова (\ w) содержит цифры, буквы и символы подчеркивания. Наконец, черта в символьном классе должна быть либо ПЕРВЫЙ, либо ПОСЛЕДНИЙ в списке, или иногда порождает ошибки или случайно ошибочно воспринимается как символ диапазона.

+0

Благодарим за помощь. preg_match для меня новичок, поэтому я лучше понимаю синтаксис. У меня есть проводник, но я не был уверен, как объединить то, что я хочу, и чего я не хочу. Это очень полезно для меня! Еще раз спасибо! –

1
preg_match("/^[^0-9]*$/", $string) 

принимает все, кроме цифр.

+1

Вам не хватает'^',' + 'и' $ '. –

+0

Действительно - слишком устал :-) –

+0

@ VedranŠego Это зависит от требований. Если вы хотите убедиться, что строка не содержит чисел, исходное регулярное выражение '/ [^ 0-9] /' отлично. Если вам нужно проверить, не содержит ли целая строка числа, ваши символы должны быть добавлены. – Arjan

Смежные вопросы