Ошибка preg_match():

sergey_prusov

Участник
Регистрация
31 Окт 2008
Сообщения
203
Реакции
4
Всем привет..... выскакивает ошибка:
<hide>PHP Warning: preg_match:)( Compilation failed: invalid range in character class at offset 23 in (адрес) on line 58</hide>

сам код того файла:
<code>
<?php
function get_user_info($user_agent = ''){
include('user_info_browsers.inc');
include('user_info_os.inc');

if(!$user_agent){
$user_agent = $_SERVER['HTTP_USER_AGENT'];
}

$res = false;

foreach($browser_name as $key => $value){
$pos = strpos($user_agent, $key);

if ($pos !== false){
$res['browser_key'] = $key;
$res['browser_name'] = $value;
break;
}
}

if(!$res['browser_key']){
$res['browser_key'] = 'Unknow';
$res['browser_name'] = 'Unknow';
}

$pattern = $browser_vers[$res['browser_key']];

if($pattern){
if(preg_match($pattern, $user_agent, $match)){
$res['browser_version'] = $match[1];
}else{
$res['browser_version'] = '';
}

}else{
$res['browser_version'] = '';
}

foreach($os_name as $key => $value){
$pos = strpos($user_agent, $key);

if ($pos !== false) {
$res['os_key'] = $key;
$res['os_name'] = $value;
break;
}
}

if (!$res['os_key']){
$res['os_key'] = 'Unknow';
$res['os_name'] = 'Unknow';
}

$pattern = $os_vers[$res['os_key']];

if($pattern){
if(preg_match($pattern, $user_agent, $match)){
$res['os_version'] = $match[1];

if ($res['os_key'] == 'Windows'){
switch ($res['os_version']){
case 'NT 5.0': $res['os_version'] = '2000'; break;
case 'NT 5.1': $res['os_version'] = 'XP'; break;
case 'NT 5.2': $res['os_version'] = 'XP 64-bit'; break;
case 'NT 6.0': $res['os_version'] = 'Vista'; break;
case 'NT 6.1': $res['os_version'] = '7'; break;
case 'NT 2000': $res['os_version'] = '2000'; break;

}
}

}else{
$res['os_version'] = '';
}

}else{
$res['os_version'] = '';
}

if(isset($res['os_key'])) unset($res['os_key']);
if(isset($res['browser_key'])) unset($res['browser_key']);

$res['os'] = $res['os_name'].' '.$res['os_version'];
$res['browser'] = $res['browser_name'].' '.$res['browser_version'];

return $res;
}
?>

</code>
ну и где косяк? Строчку красным выделил.
 
Последнее редактирование модератором:
Дебагером пройдись по переменным посмотри что с чем сравниваешь, ну или на крайняк перед ошибкой поставь типа echo($pattern +' '+ $user_agent +' '+ $match), тебе ж пишут недопустимый диапазон.
А там уже смотри.
 
сделай перед красной строкой
PHP:
echo "<pre>",var_dump($pattern),"</pre>";
 
Нужен сам патерн. Не понятно что тут $pattern = $browser_vers[$res['browser_key']]; где содержание массивов $browser_vers, $os_vers ?
 
ну и где косяк?
Косяк в паттерне, который в переменной $os_vers из подключаемого внешнего файла - в одном из элементов массива (или в нескольких) паттерн с ошибкой. Скорее всего там не экранированная черточка, которая воспринимается как диапазон. Нужно перед ней обратный слеш поставить.
 
посмотрите в каких файлах находится объявление и содержание массивов $browser_vers, $os_vers - и выложите этот файл
 
вот $browser_vers:
$browser_vers = array(
'Microsoft Internet Explorer' => '/Microsoft Internet Explorer[\/]([a-z0-9.+-]*)/i',
'Firefox' => '/Firefox[\/]([a-z0-9.+-]*)/i',
'YaBrowser' => '/YaBrowser[\/]([0-9.+-]*)/i',
'Chrome' => '/Chrome[\/]([a-z0-9.+-]*)/i',
'Safari' => '/Version[\/]([a-z0-9.+-]*)/i',
'MSIE' => '/MSIE[\s]([0-9.+-]*)[;]/i',
'Opera Mini'=> '/Opera Mini[\/]([0-9.]*)/i',
'Opera' => '/Version[\/]([a-z0-9.+-]*)/i',
'Netscape' => '/Netscape[6]?[\/]([a-z0-9.+-]*)/i',
'Unknow' => ''
);
?>

а вот $os_vers:
$os_vers = array(
'Windows' => '/Windows[\s]([a-z0-9.+-\s]*)[;)]/i',
'Macintosh' => '',
'Mac OS' => '',
'Mac_PowerPC' => '',
'Android' => '/Android ([0-9.]*)/i',
'Ubuntu' => '/Ubuntu[\/\s]([a-z0-9.+-\s]*)/i',
'Linux' => '',
'SunOS' => '',
'FreeBSD' => '',
'w3m' => '',
'J2ME/MIDP' => '',
'iPhone' => '',
'iPad' => '',
'Symbian OS' => ''
);
?>
<-------------- добавлено через 865 сек. -------------->
посмотрите в каких файлах находится объявление и содержание массивов $browser_vers, $os_vers - и выложите этот файл
уже выложил выше.
<-------------- добавлено через 2246 сек. -------------->
Забыл сказать что версия php 5.6.30
 
Ну как я и говорил - черточка (означающая диапазон (range) не экранирована). Например, вместо [a-z0-9.+-] нужно написать [a-z0-9.+\-]
Но, например a-z - это диапазон, тут не нужно экранировать.
 
Например, вместо [a-z0-9.+-] нужно написать [a-z0-9.+\-]
Там всё норм и нет нужды экранировать. Ошибку вызывает другой фрагмент [a-z0-9.+-\s] и вот тут и нужно эранировать [a-z0-9.+\-\s] или перенести этот символ в самый конец [a-z0-9.+\s-]
 
По привычке экранирую все черточки, если это не признак диапазона. Ну а так ответ на вопрос ТС найден – экранируй черточки обратным слешем кроме диапазонов (a-z и 0-9) или переноси в конец.
 
Назад
Сверху