Чтобы создать эффективный шаблон, который начинается с чередования, вам нужно только учитывать первый символ каждой альтернативы. Причина в том, что после совпадения первого символа вам не нужно проверять другую альтернативу. Вот, если подсчитать количество встречаемости для каждого первого символа в списке, я получаю:
p:4
a,c,h,j,s:2
d,f,r,x:1
Итак, картина будет выглядеть следующим образом:
(?:p...|a...|c...|h...|j...|s...|d...|f...|r...|x...)
Теперь мне нужно только заполнить каждый член чередования:
(?:ph(?:p[4s]?|tml)|aspx?|c(?:fm|gi)|html?|j(?:html|sp)|shtml?|dll|fcgi|rbml|xhtm)
Но чередование имеет стоимость, в частности, в начале шаблона, так как каждый член чередования должен быть проверен для каждых символов в строке, включая чар которые не являются одним из первых символов в чередовании. Чтобы избежать этой проблемы, вы можете использовать первый метод распознавания символов, чтобы уменьшить тесты на соответствующие символы.
(?=[acdfhjprsx])(?:ph(?:p[4s]?|tml)|aspx?|c(?:fm|gi)|html?|j(?:html|sp)|shtml?|dll|fcgi|rbml|xhtm)
Примечание: Я выбрал здесь, чтобы отсортировать первые символы от более частых до менее частых. Но если на практике вы заметите, что, например, «dll» является наиболее частым, вы можете изменить положение альтернативы «d».
Note2: не верьте, что короткий образец является эффективным образцом.
Что не так с 'in_array ($ ext, explode (',', 'asp, aspx, cfm, cgi, fcgi, dll, htm, html, shtm, shtml, jhtml, phtml, xhtm, rbml, jsp, php , ПГПС, php4')) '? – Gumbo
** ## WHY ## ?? ** Regex не зависит от ** SHORT ** и ** LONG **, просто для работы с Regex важна производительность. действительно, я предпочитаю 'asp | aspx | cfm | cgi | fcgi | dll | htm | html | shtm | shtml | jhtml | phtml | xhtm | rbml | jsp | php | phps | php4', потому что это не двусмысленно –
@Gumbo - ничего плохого в этом, но нет ничего плохого в обучении. :) –