При чём тут фамилии и нужны ли они я так и не понял. PHP я знаю на уровне
<?php echo "Hello world" ?>
.
А вот bash я знаю неплохо. И сделал бы так:
for FILE in *txt ; do
comm -12 <(cat $FILE | sed 's/[!?., ]/\n/g'|sort -u) <(sort FILE_WITH_NAME_LIST)
done
Раз просили алгоритм, то делает оно следующее: превращает файл в последовательность строк, где в каждой строке лишь одно слово. Так же подразумевается, что файл с именами представляет из себя тоже такую же последовательность, ну а потом comm таки перебором ищет совпадения.
Сравнить этот способ с php ни по производительсности ни по трудоёмкости, увы, не могу.