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

Nor*_*man 4 php regex arrays

在PHP中,是否存在函数或其他任何函数将删除数组中与正则表达式不匹配的所有元素。

我的正则表达式是这样的: preg_match('/^[a-z0-9\-]+$/i', $str)

我的数组是从表单中输入的(实际上是标签)

来自表单的原始数组。注意:邪恶标签

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

清洗过的阵列。注意,没有邪恶的标签

Array (
    [0] => french-cuisine
    [1] => french-fries
    [2] => snack-food
    [3] => fast-food
)
Run Code Online (Sandbox Code Playgroud)

我目前确实喜欢这种方法,但是有更好的方法吗?也许没有循环?

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

print_r($arr);
Run Code Online (Sandbox Code Playgroud)

Ohg*_*why 5

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

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

我们返回 preg_match 的结果是真/假。在这种情况下,它应该正确删除匹配的邪恶标签。

这是你的 eval.in


hwn*_*wnd 5

您可以preg_grep()用来过滤与正则表达式匹配的数组条目。

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

输出量

Array
(
    [0] => french-cuisine
    [1] => french-fries
    [2] => snack-food
    [4] => fast-food
)
Run Code Online (Sandbox Code Playgroud)