как то так
$names_list = ['benclinton','clintonharry','harryben','benwill','jasonsmith','smithclinton'];
$names = ['ben','harry','clinton'];
$matches = preg_grep('/('.implode('|',$names).')(?1)/', $names_list);
//- /(ben|harry|clinton)(?1)/ -- (?1) = recurse capture group 1
print_r($matches);
выход
Array
(
[0] => benclinton
[1] => clintonharry
[2] => harryben
)
Песочница
Это требует, чтобы по крайней мере два имени (даже одно и то же 2x) совпадали. Но это как бы данность в данном случае, или все будет соответствовать.
Если вы хотите быть особенно осторожным, если $names
может содержать что-то важное для регулярных выражений, такое как +
, *
, \
и т. Д., Вы можете добавить это
$matches = preg_grep('/('.implode('|',array_map(function($name){return preg_quote($name,'/');},$names)).')(?1)/', $names_list);