2010-08-31 3 views
0

J'ai dû déployer du code PHP sur un serveur partagé avec seulement PHP5.2.8. Tout le code fonctionne SAUF pour l'appel preg_filter() qui a été ajouté dans 5.3+ (et contre lequel le code a été écrit).PHP preg_filter() substitue en PHP <5.3?

Quelqu'un peut-il recommander un substitut facile pour preg_filter() en PHP5.2?

+1

code coller un exemple de code s'il vous plaît? Il serait beaucoup plus facile de vous aider – alcuadrado

+0

Hah, c'est la première fonction 5.3 que je vois qui n'a pas une douzaine de solutions de contournement dans les commentaires dans le manuel! Si je comprends bien ce qu'il fait, il devrait être assez simple de convertir en utilisant preg_match pour cela, cependant. –

Répondre

6

Le manuel PHP dit que preg_filter() est identique à preg_replace() sauf qu'il ne renvoie que les correspondances. Donc, vous pouvez utiliser une combinaison de preg_replace et array_diff pour obtenir des résultats comme preg_filter dans PHP 5.2.x. Faites comme ceci:

<?php 
$subject = array('1', 'a', '2', 'b', '3', 'A', 'B', '4'); 
$pattern = array('/\d/', '/[a-z]/', '/[1a]/'); 
$replace = array('A:$0', 'B:$0', 'C:$0'); 

$result = preg_replace($pattern, $replace, $subject); 
var_dump($result); 

//take difference of preg_replace result and subject 
$preg_filter_similar = array_diff($result, $subject); 

var_dump($preg_filter_similar); 
?> 

Cela donne la sortie (avec xDebug installé):

array 
    0 => string 'A:C:1' (length=5) 
    1 => string 'B:C:a' (length=5) 
    2 => string 'A:2' (length=3) 
    3 => string 'B:b' (length=3) 
    4 => string 'A:3' (length=3) 
    5 => string 'A' (length=1) 
    6 => string 'B' (length=1) 
    7 => string 'A:4' (length=3) 
array 
    0 => string 'A:C:1' (length=5) 
    1 => string 'B:C:a' (length=5) 
    2 => string 'A:2' (length=3) 
    3 => string 'B:b' (length=3) 
    4 => string 'A:3' (length=3) 
    7 => string 'A:4' (length=3) 

Ce qui est le même que preg_filter() output:

Array 
(
    [0] => A:C:1 
    [1] => B:C:a 
    [2] => A:2 
    [3] => B:b 
    [4] => A:3 
    [7] => A:4 
) 
+0

A pris un peu, mais le concept fonctionne ici. – Xailor

+0

Meilleure explication de preg_filter vs preg_replace – ram4nd

+0

Il semble être récursif, mettre '$ limit' de' preg_replace' à '1' n'aide pas - voir les deux premières lignes de résultats: par exemple la première ligne correspondant à' A' (contient des chiffres), puis le * résultat lui-même * correspondant à 'C' (contient le caractère' 1'). – bimlas