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

8

在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
2个回答

10
你可以使用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
)

5

我不会说这种方法一定更好,但使用正则表达式和array_filter可以像这样:

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

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

这是您的eval.in链接


需要特定版本的PHP才能运行吗?我使用的是5.3.13,但一直出现未定义变量$data的错误。Fiddle没有抛出错误,但我可以看到已更正的数组。 - Norman
“use” 不是必需的。 - Sorin
@Sorin 是的。走得太快了。谢谢。 - Ohgodwhy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接