2014-01-28 2 views
0

Может кто-нибудь помочь мне получить последнее слово из текста, который содержит только буквы.Получение последнего слова текста, содержащего только письмо в php

я должен использовать регулярные выражения, я думаю ...

Например:

100 r St Lazare, 75009 PARIS 

мне нужно слово PARIS

ответ

1

Вы можете попробовать:

$input = '100 r St Lazare, 75009 PARIS'; 
$words = explode(' ', $input); 
$last = array_pop($words); 

или

$last = $words[count($words) - 1]; 
+1

«содержащий только письмо» - как насчет '$ input = '100 r St Lazare, 75009 PARIS 546';'? – feeela

0

Регулярные выражения и explode возможные решения, однако, самый быстрый на мой взгляд substr:

$last = substr($words, strrpos($words, " ")+1); 

strrpos возвращает смещение последнего пространства. Это все, что вам нужно.

2

Если вы хотите, решение регулярок чисто, вы можете использовать

([a-z]+)$|^.*\b([a-z]+)\b 

в качестве регулярного выражения.
(Опять же, замените [a-z] с [^\s\d], если вы имеете дело с не-ASCII символов)
Demo @ regex101


По существу есть два случая:

  1. слово состоит только из букв или чисел. Поэтому не будет такого слова, как Im1Word.
    Если это так, то я бы на

    /([a-z]+)$|([a-z]+)[^a-z]+$/i 
    

    Это будет соответствовать PARIS в 100 r St Lazare, 75009 PARIS и,
    для другого примера он будет соответствовать test в just a test 7509.
    См. demo @ regex101 (флаги g и m предназначены только для нескольких строк, поэтому вы видите все, что будет соответствовать).

  2. Слово состоит из букв и номеров. Могут быть слова типа 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 символы обоих вышеупомянутых решений не удастся.
Вы должны изменить оба регулярных выражений:

  1. ([^\s\d]+)$|([^\s\d]+)[\s\d]+$
  2. "/\b[^\s\d]+\b/i"

Таким образом, вы будете соответствовать не-ASCII слова тоже.

+0

Что насчет "это просто tes1t 7509" ??? –

+0

@naveengoyal Я не думаю, что это произойдет, но тем не менее хороший момент. добавлено решение моего ответа –

+0

Это работает для '' это просто tes1t 7509'', но по-прежнему работает только на простой ASCII, что недостаточно для двух третей пользователей SO. Возможно, правильный ответ - это сочетание этой добавленной версии и моего ответа. – feeela

-1

вы можете попробовать

$text = "100 r St Lazare, 75009 PARIS"; 
$exploded = explode(" ",$text); 
echo $exploded[count($exploded)-1] 
1

Я хотел бы предложить следующую версию, хотя он по-прежнему не подходит для всех случаев:

$input = '100 r St Lazare, 75009 PARIS 345'; // pass, returns "PARIS" 
$input = '100 r St Lazare, 75009 PARIS';  // pass, returns "PARIS" 
$input = 'this just a Ðöæ 75009';   // pass, returns "Ðöæ" 
$input = 'this just a Ðöæ';     // pass, returns "Ðöæ" 
$input = 'this just a tes1t 75009';   // fail, returns "t" 

$output = array(); 
preg_match('/([^\s\d]+)[\s\d]*$/i', $input, $output); 
$lastWordThatConsistsOnlyOfLetters = array_pop($output); 

var_dump($lastWordThatConsistsOnlyOfLetters); 

(@naveengoyal Тестовых строк вы опубликовано трудно ...)

Смежные вопросы