2010-08-31 3 views
0

Пришлось развернуть код PHP на общий сервер только с PHP5.2.8. Все работы кода ЗА ИСКЛЮЧЕНИЕМ для вызова preg_filter(), который был добавлен в 5.3+ (и против которого был написан код).PHP preg_filter() заменить в PHP <5.3?

Может ли кто-нибудь порекомендовать легкую замену для preg_filter() в PHP5.2?

+1

код вы вставить образец кода, пожалуйста? Было бы намного проще помочь вам – alcuadrado

+0

Hah, это первая функция 5.3, которую я вижу, которая не имеет десятков обходных решений в комментариях в руководстве! Если я правильно понимаю, что он делает, для этого нужно довольно просто преобразовать в preg_match. –

ответ

6

В руководстве по PHP указано, что preg_filter() идентичен preg_replace(), за исключением того, что он возвращает только совпадения.

Итак, вы можете использовать комбинацию preg_replace и array_diff, чтобы получить результаты, такие как preg_filter в PHP 5.2.x. Делают это так:

<?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); 
?> 

Это дает выход (с Xdebug установлен):

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) 

Что такое же, как 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

Взял немного, но концепция здесь работает. – Xailor

+0

Лучшее объяснение preg_filter vs preg_replace – ram4nd

+0

Кажется, что рекурсивно, установка '$ limit'' preg_replace' в '1' не помогает - см. Первые две строки результатов: например, первая строка, соответствующая' A' (содержит цифры), то сам результат * * совпадает с 'C' (содержит символ' 1'). – bimlas

Смежные вопросы