正则表达式通过条件存在的值来过滤php数组

时间:2014-08-27 01:46:31

标签: php regex array-filter

我有一个php数组

    $arr[0] = "something/somethingelse/anotherval";
    $arr[1] = "something/!somevar/anotherval";
    $arr[3] = "something/!notcorrect/anotherval";
    $arr[4] = "something/somethingelse/_MyVal";
    $arr[5] = "something/_MyVal/anotherval";
    $arr[6] = "something/_AnotherNotCorrect/anotherval";

我使用array_filter按特定条件过滤数组...

    $f = array_filter(array_keys($arr), function ($k){ 
    return ( strpos($k, 'something/') !== false ); }); 

这将返回所有我的vals,其中的术语是/匹配的......我希望能够说如果我们遇到了![这里的东西]或者_ [这里的东西]那么我们需要制作确保[这里的东西]匹配$ afterExcl或$ afterUnderscore。如果我们没遇到过!或_然后只检查strpos($ k,'某事/')!== false check ...

(注意!和_部分可能或可能不在val字符串的末尾)

我认为这是正则表达式,但我总是努力构建它们。

澄清 谢谢。澄清,但!或_序列可能不是某个/之后的下一个目录,它可能会有三到四个步骤。并且,我将提供$ afterExcl或$ afterUnderscore值,它将指定已批准的值。基本上客户端正在使用!和_表示"地区"即。 东西/图片/!加拿大 某事/视频/教程/!加拿大或 something / images /!美国或 something / images /!墨西哥或最后 某事/图像/全部

然后我指定

$ afterExcl = Canada

我的过滤器会返回

东西/图片/!加拿大 东西/视频/教程/!加拿大 东西/图像/全部

1 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

$f = array_filter(array_keys($arr), function ($k){ 
    return preg_match('~something/(?![_!])~', $k); }); 

否定前瞻(?!...)会检查斜杠是否后跟!_

请注意,preg_match如果找到则返回1,否则返回0。如果您想返回truefalse,可以使用三元运算符:

return preg_match('~something/(?![_!])~', $k) ? true : false;

另一种方式

如果您使用strpos,我认为您描述为'something/'的字符串是固定字符串$str,换句话说,您知道此字符串的长度。由于strpos会在出现的字符串中返回位置$pos,因此您可以轻松检查位置$pos + strlen($str)是否有感叹号或下划线。 (例如,您可以提取下一个字符并检查它是否在数组array('!', '_')中)