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

Posted

技术标签:

【中文标题】从数组中删除与正则表达式不匹配的元素【英文标题】:Remove elements from an array that do not match a regex 【发布时间】:2014-11-02 10:23:06 【问题描述】:

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

【问题讨论】:

你可以使用array_filter 【参考方案1】:

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

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

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

Here's your eval.in

【讨论】:

这是否需要特定版本的 php 才能运行?我在 5.3.13 并不断收到未定义的变量 $data。小提琴不会抛出错误。但我可以看到更正后的数组。 use 不是必需的。 @Sorin 对。动作太快。谢谢。【参考方案2】:

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

【讨论】:

以上是关于从数组中删除与正则表达式不匹配的元素的主要内容,如果未能解决你的问题,请参考以下文章

删除元素的正则表达式与特定前缀不匹配

从 BigTable 中删除与 BigTable 中的正则表达式匹配的行

正则表达式匹配 C# 中的 Json 数组元素

正则表达式踩坑

如何匹配以下字符串,但不包括JS中的单词字符与正则表达式?

删除不包含与 Python 匹配的正则表达式的单元格/行