我只需要找到一组数字的元素,这些元素在这组字母之前或之后都有一组特定的字母和任何字符。
我有这样的数组:
$sample = array("sten", "netff", "enet", "denet");
$value = array('e', 'n', 't');
我需要找到$sample
数组中具有'e,n,t'
个字符的值以及匹配字之前或之后(任一方,不是双方)的单字符或双字符的值。如果我在模式e,n,t和1个字母之前或之后(任何一边,而不是两边)搜索它,结果将是
array("sten", "enet")
如果我在模式e,n,t和2字母之前或之后(任一方,而不是两边)搜索它,结果将是
array("netff", "denet")
我使用preg_grep()
尝试了正则表达式,但它不起作用:
之前或之后的1个字母(任何一方,不是双方):
$result = preg_grep("/^(?:.{1}".$value."|".$value.".{1})$/", $sample);
之前或之后的2个字母(任何一方,不是双方):
$result = preg_grep("/^(?:.{2}".$value."|".$value.".{2})$/", $sample);
答案 0 :(得分:1)
我将假设您已经将所有字符串预过滤为4或5个字符长 - 如果没有,您可以取消注释我的第一个过滤函数。
输入:
$findgroup=['eaten','enter','tend','sten','neat','dents','enet','netty','teeth','denet','teen','spent'];
$values=['e','n','t'];
方法:
//$findgroup=array_filter($findgroup,function($v){return strlen($v)==4 || strlen($v)==5;});
$findgroup=array_filter($findgroup,function($v)use($values){
return
sizeof(array_intersect(array_unique(str_split(substr($v,0,3))),$values))==3 ||
sizeof(array_intersect(array_unique(str_split(substr($v,-3))),$values))==3;
});
var_export($findgroup);
// omitted: neat, dents, teeth, teen
输出:
array (
0 => 'eaten',
1 => 'enter',
2 => 'tend',
3 => 'sten',
6 => 'enet',
7 => 'netty',
9 => 'denet',
11 => 'spent',
)