Ваш код уже делает то, что вы хотите:
<?php
$data = array(
// Valid
'Jim',
'John',
"O'Toole",
'one-two',
"Daniel'Blackmore",
// Invalid
' Jim',
'abc123',
'$@#$%@#$%&*(*&){}//;;',
);
foreach($data as $firstname){
if( preg_match("/[^a-zA-Z'-]+/",$firstname) ){
echo 'Invalid: ' . $firstname . PHP_EOL;
}else{
echo 'Valid: ' . $firstname . PHP_EOL;
}
}
... отпечатки:
Valid: Jim
Valid: John
Valid: O'Toole
Valid: one-two
Valid: Daniel'Blackmore
Invalid: Jim
Invalid: abc123
Invalid: $@#$%@#$%&*(*&){}//;;
Одинарная кавычка не имеет никакого особого значения в регулярных выражениях, поэтому она не нуждается в особой обработке. Знак минус (-
), находящийся внутри []
, означает диапазон ; если вам нужен литерал -
, это должен быть первый или последний символ, как в вашем коде.
Сказал, что ошибка (если есть) где-то еще.