2012-04-16 5 views
2

Я хочу разрешать только буквы, цифры, пробелы, символы и символы дефисов.Preg_match проверка специальных символов внутри строки

До сих пор я думал, что это preg_match бы сделать работу:

if(preg_match('/[^a-z0-9 _]+$/i', $name)) { 
$error = "Name may only contain letters, numbers, spaces, \"_\" and \"-\"."; 
} 

Но я просто понял, что специальные символы внутри строки, не будет генерировать ошибку. Например

привет "@ £ $ джо

не будет генерировать ошибку. Можно сделать небольшие изменения и заставить его работать, или мне нужно другое решение?

ответ

3

Проблема с символом $. Вы специально просите его соответствовать концу строки. Выражение /[^a-z0-9 _]+$/i не соответствует hello"@£$joe т.к. joe соответствует [a-z0-9 _]+$; поэтому он явно не будет соответствовать, если вы отрицаете класс. Удалите $ символ, и все будет, как и ожидалось:

if(preg_match('/[^a-z0-9 _]+/i', $name)) { 
// preg_match will return true if it finds 
// a character *other than* a-z, 0-9, space and _ 
// *anywhere* inside the string 
} 

Test в вашем браузере, вставив эти строки по одному в консоли JavaScript:

/[^a-z0-9 _]+/i.test("@hello");  // true 
/[^a-z0-9 _]+/i.test("[email protected]");   // true 
/[^a-z0-9 _]+/i.test("hello\"@£$joe"); // true 
/[^a-z0-9 _]+/i.test("hello joe");  // false 
+0

Спасибо, это сработало! – 2by

+0

Большое вам спасибо @salman –

0

Вы должны принести ^ вне класса символов:

if(preg_match('/^[a-z0-9 _]+$/i', $name)) { 

^ внутри (в начале) класс символов действует как отрицательный символ класса.

+0

Извините, но это не работает – 2by

0
/^([a-z]|[A-Z]|[0-9]| |_|-)+$/ 

использовать это регулярное выражение

+0

Почему не поместить все в один класс? '[-_ a-zA-Z0-9]' – ThiefMaster

+0

Извините, но это не сработает – 2by

0

Здесь Отнесите:

/^[a-z0-9\s\-_]+$/i 

это выражение опробован мною с фиктивными данными.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Untitled Document</title> 
<script> 
function valueanalysis(form){ 
    var vals = form.vals.value; 

    alert(/^[a-z0-9\s\-_]+$/i.test(vals)); 

    return false; 
} 
</script> 
</head> 

<body> 
<form onsubmit="return valueanalysis(this);"> 
<input type="text" name="vals"/> 
<input type="submit" value="Check" /> 
</form> 
</body> 
</html> 

использовать этот код в HTML-файл проверить проверки, заполнив значение и нажмите клавишу ВВОД после, чтобы проверить, правда это или нет.

Примечание: - регулярные выражения одинаковы для всех языков.

<?php 


if(preg_match("/^[a-z0-9\s\-_]+$/i","ASDhello-dasd asddasd_dsad")){ 
    echo "true"; 
} 
else{ 
    echo "false"; 
} 
?> 
+1

Извините, но я не могу получить это, чтобы работать – 2by

+0

Возможно, вы делаете что-то не так, что он отлично работает в моем случае. каждое значение работает правильно, возьмите это редактирование в ответ –

+0

Хм, да, это работает, когда я проверяю ваш код. Но при использовании PHP это теперь работает: 'if (preg_match ('/^[a-z0-9 \ s \ -_] + $/i', $ name)) { $ error =" Имя может содержать только буквы , числа, пробелы, \ "_ \" и \ "- \". "; } ' – 2by

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