Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/11/2011, 23h31   #1
Membre habitué
 
Inscription : mai 2004
Messages : 383
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 383
Points : 129
Points : 129
Par défaut Warning: preg_match_all() mais pas en local

Salut,

J'utilise cette fonction php:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
 
function getBrowser()
{
    $u_agent = $_SERVER['HTTP_USER_AGENT'];
    $bname = 'Unknown';
    $platform = 'Unknown';
    $version= "";
 
    //First get the platform?
    if (preg_match('/linux/i', $u_agent)) {
        $platform = 'linux';
    }
    elseif (preg_match('/macintosh|mac os x/i', $u_agent)) {
        $platform = 'mac';
    }
    elseif (preg_match('/windows|win32/i', $u_agent)) {
        $platform = 'windows';
    }
 
    // Next get the name of the useragent yes seperately and for good reason
    if(preg_match('/MSIE/i',$u_agent) && !preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Internet Explorer';
        $ub = "MSIE";
    }
    elseif(preg_match('/Firefox/i',$u_agent))
    {
        $bname = 'Mozilla Firefox';
        $ub = "Firefox";
    }
    elseif(preg_match('/Chrome/i',$u_agent))
    {
        $bname = 'Google Chrome';
        $ub = "Chrome";
    }
    elseif(preg_match('/Safari/i',$u_agent))
    {
        $bname = 'Apple Safari';
        $ub = "Safari";
    }
    elseif(preg_match('/Opera/i',$u_agent))
    {
        $bname = 'Opera';
        $ub = "Opera";
    }
    elseif(preg_match('/Netscape/i',$u_agent))
    {
        $bname = 'Netscape';
        $ub = "Netscape";
    }
 
    // finally get the correct version number
// finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
    ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';
    if (!preg_match_all($pattern, $u_agent, $matches)) {
        // we have no matching number just continue
    }
 
    // see how many we have
    $i = count($matches['browser']);
    if ($i != 1) {
        //we will have two since we are not using 'other' argument yet
        //see if version is before or after the name
        if (strripos($u_agent,"Version") < strripos($u_agent,$ub)){
            $version= $matches['version'][0];
        }
        else {
            $version= $matches['version'][1];
        }
    }
    else {
        $version= $matches['version'][0];
    }
 
    // check if we have a number
    if ($version==null || $version=="") {$version="?";}
 
    return array(
        'userAgent' => $u_agent,
        'name'      => $bname,
        'version'   => $version,
        'platform'  => $platform,
        'pattern'    => $pattern
    );
}
Je n'ai pas de soucis en local, ca me repère bien Firefox 7.0.1. Mais sur le serveur je n'ai pas le numéro de version du navigateur et j'ai un warning:
Warning: preg_match_all() [function.preg-match-all]: Compilation failed: unrecognized character after (?< at offset 3 in getbrowser.php on line 135

La ligne 135 est:
Code :
    if (!preg_match_all($pattern, $u_agent, $matches)) {
juste avant, il y a:
Code :
1
2
3
4
5
6
 
    // finally get the correct version number
// finally get the correct version number
    $known = array('Version', $ub, 'other');
    $pattern = '#(?<browser>' . join('|', $known) .
    ')[/ ]+(?<version>[0-9.|a-zA-Z.]*)#';

Ca marche en local, je comprends pas pourquoi ca ne passe pas sur le serveur.

Vous avez une idée ? Je m'y connais pas trop en pattern et je ne peux pas utiliser get_browser, j'utilise un serveur mutualisé et y a un soucis de browscap.

Merci.
defacta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 01h47   #2
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Version < 5.2.2 ?

Citation:
Envoyé par Documentation de preg_match_all :
5.2.2 Les sous-masques nommés acceptent maintenant les syntaxes (?<name>), (?'name') ainsi que (?P<name>). Les précédentes versions n'acceptaient que la syntaxe (?P<name>).
Si oui, il faut rajouter le P entre ? et < dans les captures nommées pour des versions antérieures à 5.2.2 de PHP (à moins que PHP n'ait été (re)compilé avec une autre installation plus récente de PCRE >= 7.0 que celle qu'il inclut).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 08h11   #3
Membre habitué
 
Inscription : mai 2004
Messages : 383
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 383
Points : 129
Points : 129
Citation:
Envoyé par julp Voir le message
Version < 5.2.2 ?


Si oui, il faut rajouter le P entre ? et < dans les captures nommées pour des versions antérieures à 5.2.2 de PHP (à moins que PHP n'ait été (re)compilé avec une autre installation plus récente de PCRE >= 7.0 que celle qu'il inclut).
c'était bien ça. Merci beaucoup, j'avais peur de ne pas m'en sortir avec cette fonction alors que je m'en sers un peu partout
defacta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2011, 09h36   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 141
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 141
Points : 8 507
Points : 8 507
encore une fois pas besoin de regex pour faire ça utilise get_browser
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h04.


 
 
 
 
Partenaires

Hébergement Web