我有一个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
我的过滤器会返回
东西/图片/!加拿大 东西/视频/教程/!加拿大 东西/图像/全部
答案 0 :(得分:0)
您可以使用以下内容:
$f = array_filter(array_keys($arr), function ($k){
return preg_match('~something/(?![_!])~', $k); });
否定前瞻(?!...)
会检查斜杠是否后跟!
或_
。
请注意,preg_match
如果找到则返回1,否则返回0。如果您想返回true
或false
,可以使用三元运算符:
return preg_match('~something/(?![_!])~', $k) ? true : false;
另一种方式:
如果您使用strpos
,我认为您描述为'something/'
的字符串是固定字符串$str
,换句话说,您知道此字符串的长度。由于strpos
会在出现的字符串中返回位置$pos
,因此您可以轻松检查位置$pos + strlen($str)
是否有感叹号或下划线。 (例如,您可以提取下一个字符并检查它是否在数组array('!', '_')
中)