2013-09-06 2 views
3

Я сделал это регулярное выражение:позволяют круглые скобки и другие символы в регулярных выражениях

^[a-zA-Z0-9_.-]*$ 

Поддержка:

letters [uppercase and lowercase] 
numbers [from 0 to 9] 
underscores [_] 
dots [.] 
hyphens [-] 

Теперь я хочу, чтобы добавить эти:

spaces [ ] 
comma [,] 
exclamation mark [!] 
parenthesis [()] 
plus [+] 
equal [=] 
apostrophe ['] 
double quotation mark ["] 
at [@] 
dollar [$] 
percent [%] 
asterisk [*] 

Например , этот код принимает только некоторые из приведенных выше символов:

^[a-zA-Z0-9 _.,-!()+=“”„@"$#%*]*$ 

Возвращает:

Предупреждение: preg_match(): Компиляция не удалось: круг из строя в классе символов со смещением 16

+0

@ VladPreda: Нет, это не проблема. Ни один из этих символов не должен быть экранирован, когда они появляются внутри класса символов. –

ответ

13

Обязательно установите дефис - либо в начале, либо в end в символьном классе, иначе он должен быть экранирован. Попробуйте это регулярное выражение:

^[a-zA-Z0-9 _.,!()+=`,"@$#%*-]*$ 

Кроме того, обратите внимание, что из-за * он будет даже соответствовать пустой строке. Если вы не хотите, чтобы соответствовать пустые строки, то используйте +:

^[a-zA-Z0-9 _.,!()+=`,"@$#%*-]+$ 

Или лучше:

^[\w .,!()+=`,"@$#%*-]+$ 

TEST:

$text = "_.,!()+=,@$#%*-"; 
if(!preg_match('/\A[\w .,!()+=`,"@$#%*-]+\z/', $text)) { 
    echo "error."; 
} 
else { 
    echo "OK."; 
} 

Печать:

OK. 
+0

Пробел уже находится в классе символов (после '9') –

+0

@Cataiin: Почему' @ 'экранируется на вашем входе? См. Редактирование моего ответа на вашем примере. – anubhava

+0

'** Демо-версия: **' http://ideone.com/raBbot – anubhava

3

Попробуйте избежать ваши регулярные выражения: [a-zA-Z0-9\-\(\)\*]

Проверьте, если это помогите вам: How to escape regular expression special characters using javascript?

+0

Ни один из вновь добавленных символов не должен быть экранирован, если они появляются внутри класса символов (что они и делают). Единственным проблемным персонажем является дефис, и другие респонденты объяснили, как с этим бороться. –

+0

О, и, возможно, причудливые цитаты ('' "" '). Но [ответ Спадли] (http://stackoverflow.com/a/18660140/20938) касается этих вопросов. –

2

Внутри символьного класса [...] дефис - имеет особое значение, если оно не является первым или последним символом, так что вам нужно, чтобы избежать его:

^[a-zA-Z0-9 _.,\-!()+=“”„@"$#%*]*$ 

Ни один из других персонажей не должны быть экранированы в класс символов (кроме ]). Вам также нужно будет избежать цитаты с указанием строки. например

'/[\']/' 
"/[\"]/" 
4

Дефис в настоящее время рассматривается в качестве маркеров диапазона - когда он видит ,-! он думает, что вы просите диапазон всех символы в кодировке, которые попадают между , и ! (то есть так же, как A-Z работы Это не то, что вы хотите.

Либо убедитесь, что дефис является последним символом в классе символов, как это было раньше, или с помощью обратного слэша.

Я также хотел бы указать, что символы кодов, которые вы используете “”„, являются частью расширенной кодировки и не совпадают с основными котировками ASCII "'. Вы можете включить оба набора в свой шаблон. Если вам нужно включить символы не ASCII в шаблон, вы также должны добавить модификатор u после окончания вашего шаблона, чтобы он правильно подбирал символы юникода.

0

попробовать это

^[A-Z0-9] [A-Z0-9 * & _ ^% $ # @ ~, = +,/\ |!.} {) (~ `? ] [;:. \ ' „“ -] {0,8} $

использовать этот link to test

фокус в том, я заказал обратный скобки и другие фигурные скобки, которые заботилась о некоторых проблемах и квадратные скобки вам нужно избегать их

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