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

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

Я использую PHP для замены чего-либо в строке, если это не аз, 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, ',' );
}

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

18
задан Robin 17 February 2012 в 18:17
поделиться