Регулярное выражение допускает только буквенно-цифровые, запятые, дефис, подчеркивание и точку с запятой
У меня уже есть рабочий код, но мне нужен кто-то, чтобы помочь объяснить, почему он работает, если он может!
Я использую 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, ',' );
}
Спасибо за любую помощь:)
Ответы
Ответ 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
Вы можете избежать дефиса и поместить его где-нибудь в регулярное выражение, например, \-
Что же касается конечных точек с запятой и запятыми, попробуйте это /[,;]+$/
, они должны совпадать с запятыми и точкой с запятой в конце, даже если их много.