Почему этот regex занимает так много времени, чтобы найти адреса электронной почты в определенных файлах?

У меня есть регулярное выражение, которое ищет адреса электронной почты (это было взято из другого поста SO, который я не могу найти и был протестирован на всех видах конфигураций электронной почты ... изменение этого не совсем мой вопрос ... но поймите, если это первопричина):

/[a-z0-9_\-\+]+@[a-z0-9\-]+\.([a-z]{2,3})(?:\.[a-z]{2})?/i

Я использую preg_match_all() в PHP.

Это отлично работает для 99.99...% файлов, в которых я ищу, и занимает около 5 мс, но иногда занимает пару минут. Эти файлы больше, чем средняя веб-страница, около 300k, но гораздо большие файлы обычно обрабатываются нормально. Единственное, что я могу найти в содержимом файлов, которое выделяется, это строки из тысяч последовательных "случайных" буквенно-цифровых символов, таких как:

wEPDwUKMTk0ODI3Nzk5MQ9kFgICAw9kFgYCAQ8WAh4H...

Вот две страницы, вызывающие проблему. Просмотрите источник, чтобы увидеть длинные строки.

Есть мысли о том, что является причиной этого?

--ОБЩИЕ РЕШЕНИЯ--

Я протестировал различные регексы, предложенные в ответах. Ответ @FailedDev помог и сократил время обработки с нескольких минут до нескольких секунд. Ответ @hakre решил проблему и сократил время обработки до нескольких сотен миллисекунд. Ниже приведен окончательный вариант regex, который я использовал. Это второе предложение @hakre.

/[a-z0-9_\-\+]{1,256}+@[a-z0-9\-]{1,256}+\.([a-z]{2,3})(?:\.[a-z]{2})?/i

7
задан T. Brian Jones 7 December 2011 в 01:18
поделиться