Спасибо Клод. Поправлю ваше регулярное выражение следующим образом - на проверку любого пробельного символа в начале и конце отслеживаемой метки браузера и закрывающей скобки в конце, а не открывающей. Внесенные мной правки помечены таким цветом.
regex_replace:'/[\s;\(]msie \d+(\.\d+)?[\s;\)]/i':''
На мой взгляд пробельный символ в конце метки необходимо проверять на случай (конечно теоретический, но вполне возможный), когда метка браузера представлена какой-нибудь нестандартной строкой, например MSIE 8.0 Special Edition;, ведь в этом случае ваше регулярное выражение просто не опознает метку браузера, потому что в конце метки ожидает или точку с запятой, или скобку.
А пользователям движка объясню суть решения, предложенного Клодом. Взглянем на типичное содержимое браузерного заголовка User Agent, когда браузер сообщает о совместимости с Microsoft Internet Explorer.
Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)
Поскольку эта информация доступна в PHP через переменную $_SERVER['HTTP_USER_AGENT'], содержимое которой шаблонизатор Smarty помещает в свою переменную $smarty.server.HTTP_USER_AGENT, то Клод предложил отследить метку браузера прямо в шаблоне, а именно в первой строке файла index.tpl, на основании чего сформировать тот или иной тег <!DOCTYPE html ...>.
В первой строке своего решения Клод получает значение браузерного заголовка User Agent в локальную переменную $agent. Модификатор |default:'' применен на случай отсутствия заголовка (нет жесткого требования, чтобы браузеры обязательно сообщали информацию о себе).
{$agent = $smarty.server.HTTP_USER_AGENT|default:''}
В следующих строках решения производится сравнение локальной переменной (исходного значения заголовка) с тем же значением, пропущенным через модификатор |regex_replace:'искать':'заменить_на', который ищет в значении метку браузера и заменяет пустой строкой. Если сравнение дало несовпадение, значит в строке присутствовала искомая метка, и следовательно это искомый браузер.
Синтаксис регулярных выражений не все знают, поэтому объясню, что было закодировано в регулярном выражении. Я размечу выражение разными цветами и опишу смысл каждого.
- само выражение должно быть заключено в подобие кавычек (произвольный символ)
- перед меткой должен быть пробельный символ, или точка с запятой, или открывающая скобка
- метка состоит из текста MSIE и за ним через пробел некоторое ЧИСЛО
- за ЧИСЛОМ не исключено что может быть точка и за ней число
- за меткой должен быть пробельный символ, или точка с запятой, или закрывающая скобка
- само выражение должно быть заключено в подобие кавычек (тот же произвольный символ)
- за "кавычками" перечисляются флаги: i = обрабатывать выражение без учета регистра букв
Любые специальные символы, - например точка, круглые скобки, квадратные скобки, фигурные скобки, плюс, звездочка, вопросительный знак, слеш и некоторые другие, - которые хотят интерпретировать именно как простые текстовые символы, должны предваряться слешем, иначе такие символы будут расцениваться как операторы регулярных выражений.
Любые простые текстовые символы, - например s, d, w и некоторые другие, - которые хотят интерпретировать именно как специальные символы, должны предваряться слешем.