Соответствие версии браузера - разрывы регулярных выражений в PHP 5.1.6

Я использую скрипт для обнаружения браузера и его версии, на который несколько раз ссылаются в get_browser на странице php.net.

Файл, содержащий сценарий, сохраняется как UTF-8, и на самом деле он отлично работает »:

// relevant parts only where $ub stores the browser name like "Safari"
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$known = array('Version', $ub, 'other');
$pattern = '#(?<browser>' . join('|', $known) . ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
preg_match_all($pattern, $userAgent, $matches);

Теперь у нас есть сайт на сервере, который использует PHP 5.1.6. К сожалению, он нарушает регулярное выражение и отображает это предупреждение:

Предупреждение PHP: preg_match_all () [function.preg-match-all]: Ошибка компиляции: нераспознанный символ после (? ‹По смещению 3 в /file.php в строке 48

Как нужно обновить шаблон, чтобы он работал правильно с PHP 5.1.6?


person insertusernamehere    schedule 14.02.2013    source источник
comment
Вам действительно стоит перейти на PHP 5.4   -  person cryptic ツ    schedule 14.02.2013
comment
@cryptic ツ Верно. Но, к сожалению, это не в моих руках, так как кто-то другой запускает Typo3 на том же самом сервере, который в настоящий момент не может быть обновлен - так мне сказали.   -  person insertusernamehere    schedule 14.02.2013
comment
ВНИМАНИЕ: PHP 5.1 был объявлен устаревшим в 2006 году, и с тех пор в нем не было никаких исправлений ошибок или обновлений безопасности. Он сильно устарел и небезопасен и не должен использоваться в производственной системе.   -  person SDC    schedule 14.02.2013
comment
Также имейте в виду, что строка HTTP_USER_AGENT может быть ненадежной. Некоторые браузеры позволяют подделывать его, а также некоторые программы, такие как прокси и анонимайзеры, полностью удаляют строку пользовательского агента. Будьте осторожны, полагаясь на него.   -  person SDC    schedule 14.02.2013
comment
@SDC Спасибо, что снова указали на это. Этот вопрос не должен побуждать кого-то использовать PHP 5.1. Это действительно дилемма, о которой я писал в своем первом комментарии.   -  person insertusernamehere    schedule 14.02.2013
comment
@SDC Это правда. Он используется только для отображения нескольких подсказок (iOS, IE7 и т. Д.). Так что от этого ничего важного не зависит.   -  person insertusernamehere    schedule 14.02.2013
comment
@insertusernamehere - re php5.1: достаточно честно. Фактически, во всяком случае, этот вопрос должен увести других прочь от php5.1! :-) Однако вы упомянули, что это из-за Typo3. Я отмечу, что: (а) текущие версии Typo3 поддерживают текущие версии PHP, поэтому это явно устаревшая и, вероятно, небезопасная версия Typo3, и (б) можно запускать несколько версий PHP на тот же сервер; нет никаких причин, по которым один устаревший пользователь с головой в песке должен удерживать других от безопасности.   -  person SDC    schedule 14.02.2013
comment
@SDC Все верно. В данном случае это действительно так: я обновляю свою часть в SVN, и чья-то задача - загрузить ее и запустить сервер. У нас было подобное обсуждение сразу после того, как он сказал мне, что это PHP 5.1.6. :)   -  person insertusernamehere    schedule 14.02.2013
comment
@insertusernamehere - достаточно честно. Я оставлю это как есть. Пока все знают о потенциальных проблемах и если (когда) сервер будет взломан, никто не может сказать, что не знал. :-)   -  person SDC    schedule 14.02.2013


Ответы (1)


Синтаксис, который вы пытаетесь использовать, не представлен до версии PHP 5.2.2. (?<name>pattern). Вы сможете использовать это вместо (?P<name>pattern).

person Peter O'Callaghan    schedule 14.02.2013