2

我有一个字符串数组,并想从数组中删除包含单词“Free_Course”的所有元素

该数组包含诸如“Free_Course_123”、“Free_Course_124”、“Other_Course_123”、“Other_Course_1234”等字符串。

我只想遍历数组,并删除所有包含“Free_Course”的内容,这样就可以去掉上面列出的前两个元素。

我试过使用这个 preg_grep 功能,但到目前为止还没有成功:

$cleanTags= preg_grep("/^Free_Course*/", $tags);
4

7 回答 7

3

您可以使用原生 PHP 函数strpos ( http://php.net/manual/fr/function.strpos.php ) 来识别数组中应该删除的值:

<?php

foreach ($tags as $index => $tag) {
      if (strpos($tag, 'Free_Course') !== false) {
          unset($tags[$index]);
      }
}
于 2013-04-22T18:23:47.980 回答
2

你有没有尝试过

$tags = array(
    "Free_Course_123", 
    "Free_Course_124", 
    "Other_Course_123", 
    "Other_Course_1234"
);
$cleanTags= preg_grep("/Free_Course/", $tags, PREG_GREP_INVERT);
print_r($cleanTags);

? 最后一个属性反转过滤功能,见手册

我已经测试了结果,它应该从 PHP 4.2.0 开始工作

Array ( [2] => Other_Course_123 [3] => Other_Course_1234 )
于 2013-04-22T18:24:21.817 回答
1

你可以做一个 preg_match,只返回那些不匹配的。

foreach($array as $key => $value)
    if(!preg_match("/Free_Course/i", $value))
        echo $value . '<br>';

或者创建一个新数组...

foreach($array as $key => $value)
    if(!preg_match("/Free_Course/i", $value))
        $new_array[] = $value;
于 2013-04-22T18:26:13.843 回答
1

试试这个

<?php
foreach( $tags as $key => $val )
{
   if( !preg_grep( "/(?!Free_Course).*/", $tags ) ) {
      echo $val;
   }
}
?>
于 2013-04-22T18:30:01.947 回答
0

使用 array_walk:

$arr = array(
    "Free_Course_123", 
    "Free_Course_124", 
    "Other_Course_123", 
    "Other_Course_1234"
);

$arr = array_filter($arr, function($e){
    return strpos($e, 'Free_Course') === false;
});

(编辑:我误解了这个问题)

于 2013-04-22T18:28:27.517 回答
0
$cleanTags = array_diff($tags, preg_grep("/Free_Course.*/", $tags));
于 2013-04-22T18:32:26.843 回答
0

“^”仅在字符类列表的开头使用时表示否定,即“[^a-zA-Z0-9]+ 表示“一个或多个不是字母数字字符的字符”。

如果您在 (perl) 正则表达式的开头使用“^”,则表示“后面必须在行首”。所以“/^Free_Course*/”将匹配任何以“零个或多个文本'Free_Course'实例”开头的字符串,这不是你想要的。

我会使用 Thierry Marianne 的解决方案。

如果您想知道“我如何用正则表达式否定一个词?”,请参阅此线程:

正则表达式匹配不包含单词的行?

于 2013-04-22T18:37:59.473 回答