preg_match регулярное выражение проверки имени пользователя позволяет> и <несмотря на то, что эти символы не включены в белый список

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

// Enforce that username has to be 3-100 characters, alphanumeric, and first character a letter.
// Possibility without begin/end characters and i: [a-z][a-z0-9@.+-_]{2,100}
// Allow for simple email usernames in the future...
return !!preg_match('#^[a-zA-Z][a-zA-Z0-9@.+-_]{2,100}$#', trim($username));

Что, к сожалению, разрешает эти тестовые строки, готовые к XSS:

'angle<bracket',
'angle>bracket',
'html<script>inside',

И я понятия не имею, почему, поскольку они уже должны быть явно запрещены регулярным выражением.

Вот текущий тестовый пример:

http://ideone.com/od7dj

Кто-нибудь знает, почему угловые скобки допускаются регулярным выражением, которое явно не допускает их? Я должен избегать одного из этих символов (. + -) как литералов?

Ответы на вопрос(2)

Ваш ответ на вопрос