- preg_match: documentation ( source)
<?php
$names = [
'Pérez-González',
'Domínguez-Díaz',
'Güemez-Martínez',
'Johnson-De Sosa',
'Pérez-De la Cruz',
'smith',
'Pérez De la Cruz-González',
'de Gal-O\'Connell',
'Johnson--Johnson'
];
foreach ($names as $name) {
echo "$name is " . (!preg_match("~^\pL+(?:[- ']\pL+)*$~u", $name) ? 'in' : '') . "valid\n";
}