Php 从与正则表达式不匹配的数组中删除元素

Php 从与正则表达式不匹配的数组中删除元素,php,arrays,regex,Php,Arrays,Regex,在PHP中,是否有一个函数或其他任何东西可以删除数组中与正则表达式不匹配的所有元素 我的正则表达式是:preg_match('/^[a-z0-9\-]+$/i',$str) 我的数组是这样的,来自一个表单(它们实际上是标记) 来自表单的原始数组。注意:邪恶标签 $arr = array ( "french-cuisine", "french-fries", "snack-food", "evil*tag!!", "fast-food", "more

在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
)
已清理阵列。注意,没有邪恶标签

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

我不一定会说它本身更好,但使用regexp和array_filter可能看起来像这样:

$data = array_filter($arr , function ($item){
    return preg_match('/^[a-z0-9\-]+$/i', $item);
});
我们将返回preg_匹配的结果,该结果为真/假。在这种情况下,它应该正确地删除匹配的邪恶标签

您可以使用来筛选与正则表达式匹配的数组项

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

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

您可以使用
array\u filter
。这是否需要特定版本的php才能运行?我在5.3.13上,一直在获取未定义的变量$data。小提琴不会出错。但是我可以看到正确的数组。
不需要使用
。@Sorin Right。行动太快了。谢谢