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

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

У меня уже есть рабочий код, но мне нужен кто-то, чтобы помочь объяснить, почему он работает, если он может!

Я использую PHP для замены чего-либо в строке, если это не az, AZ, 0-9, запятая, точка с запятой, символ подчеркивания или дефис (который в конечном итоге должен представлять либо одно имя пользователя, либо запятую/список точек с запятой, разделенных запятой).

Следующие работы:

$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, ',' );
}

Спасибо за любую помощь:)

4b9b3361

Ответ 1

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

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.

Нет четкой прогрессии от _ до ,, поэтому механизм regex не уверен, что с этим делать. В классах символов, если вы хотите, чтобы дефис интерпретировался буквально, он должен быть в самом начале или конце класса (или экранирован с обратной косой чертой). Поэтому любой из них будет работать:

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

Что касается обрезки конца, вы можете сделать все это в одном регулярном выражении:

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

Ответ 2

Я считаю, что размещение дефиса, которое имеет значение, должно начинаться или заканчиваться как дефис (буквальный), в противном случае он используется для определения диапазона.

Ответ 3

Вы можете избежать дефиса и поместить его где-нибудь в регулярное выражение, например, \-

Что же касается конечных точек с запятой и запятыми, попробуйте это /[,;]+$/, они должны совпадать с запятыми и точкой с запятой в конце, даже если их много.