2014-09-09 2 views
3

В PHP есть функция или что-то еще, что приведет к удалению всех элементов в массиве, которые не соответствуют регулярному выражению.Удалить элементы из массива, которые не соответствуют регулярному выражению

Мой регулярное выражение это: preg_match('/^[a-z0-9\-]+$/i', $str)

моего массива приходят как это, из формы (они на самом деле теги)

Оригинальный массив из формы. Примечание: худые теги

$arr = array (
    "french-cuisine", 
    "french-fries", 
    "snack-food", 
    "evil*tag!!", 
    "fast-food", 
    "more~evil*tags" 
); 

Очищенный массив. Обратите внимание, что не зло теги

Array (
    [0] => french-cuisine 
    [1] => french-fries 
    [2] => snack-food 
    [3] => fast-food 
) 

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

foreach($arr as $key => $value) { 
    if(!preg_match('/^[a-z0-9\-]+$/i', $value)) { 
     unset($arr[$key]); 
    } 
} 

print_r($arr); 
+1

Вы можете использовать 'array_filter'. – Barmar

ответ

4

Вы можете использовать preg_grep() для фильтрации записей массива, которые соответствуют регулярному выражению.

$cleaned = preg_grep('/^[a-z0-9-]+$/i', $arr); 
print_r($cleaned); 

Выход

Array 
(
    [0] => french-cuisine 
    [1] => french-fries 
    [2] => snack-food 
    [4] => fast-food 
) 
4

я бы не обязательно сказать, что это лучше, само по себе, но с использованием регулярных выражений и array_filter может выглядеть примерно так:

$data = array_filter($arr , function ($item){ 
    return preg_match('/^[a-z0-9\-]+$/i', $item); 
}); 

Где мы возвращаем результат preg_match который является либо истинным, /ложный. В этом случае он должен правильно удалить совпадающие теги зла.

Here's your eval.in

+0

Для этого нужна конкретная версия php? Я на 5.3.13 и продолжаю получать неопределенные переменные $ data. Скрипка не вызывает ошибку. Но я вижу исправленный массив. – Norman

+0

@Norman Все, что вам нужно, это PHP 5.3.x – Ohgodwhy

+0

'use' не требуется. – Sorin

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