Если вы хотите, решение регулярок чисто, вы можете использовать
([a-z]+)$|^.*\b([a-z]+)\b
в качестве регулярного выражения.
(Опять же, замените [a-z]
с [^\s\d]
, если вы имеете дело с не-ASCII символов)
Demo @ regex101
По существу есть два случая:
слово состоит только из букв или чисел. Поэтому не будет такого слова, как Im1Word
.
Если это так, то я бы на
/([a-z]+)$|([a-z]+)[^a-z]+$/i
Это будет соответствовать PARIS
в 100 r St Lazare, 75009 PARIS
и,
для другого примера он будет соответствовать test
в just a test 7509
.
См. demo @ regex101 (флаги g
и m
предназначены только для нескольких строк, поэтому вы видите все, что будет соответствовать).
Слово состоит из букв и номеров. Могут быть слова типа Im1Word
.
выше регулярное выражение не будет достаточно, и я хотел бы сделать это с некоторой более логикой в коде:
$input = "100 r St Lazare, 75009 PARIS 123 abc123 123";
$words = explode(' ', $input);
for($i = count($words)-1; $i >= 0; $i--) {
if(preg_match("/\b[a-z]+\b/i",$words[$i]) == 1) {
echo "Match: " . $words[$i];
break;
}
}
По существу, мы разбиваем строку пробела и не перебирать каждый элемент с конца до начала , Всякий раз, когда элемент соответствует \b[a-z]+\b
, мы нашли последнее слово, состоящее только из букв.
Example @ ideone
Теперь, если у вас есть какие-либо не-ASCII символы обоих вышеупомянутых решений не удастся.
Вы должны изменить оба регулярных выражений:
([^\s\d]+)$|([^\s\d]+)[\s\d]+$
"/\b[^\s\d]+\b/i"
Таким образом, вы будете соответствовать не-ASCII слова тоже.
«содержащий только письмо» - как насчет '$ input = '100 r St Lazare, 75009 PARIS 546';'? – feeela