Алгоритм поиска имён в тексте
Более эффективные алгоритмы конечно есть, но я бы не стал терять время на оптимизацию, если несколько текстов по паре тысяч слов — это все что надо обработать. Есть большая вероятность что создание оптимальной программы займет больше времени чем работа неоптимальной.
При чём тут фамилии и нужны ли они я так и не понял. 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 ни по производительсности ни по трудоёмкости, увы, не могу.