【问题标题】: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

标签: php arrays regex


【解决方案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
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 2012-07-05
    相关资源
    最近更新 更多