有人可以帮助我从仅包含字母的文本中获取最后一个单词。
我应该使用正则表达式,我认为......
例如:
100 r St Lazare, 75009 PARIS
我需要PARIS
答案 0 :(得分:2)
如果您需要纯正则表达式解决方案,可以使用
([a-z]+)$|^.*\b([a-z]+)\b
作为你的正则表达式。
(如果您正在处理非ascii字符,请再次将[a-z]
替换为[^\s\d]
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词。
答案 1 :(得分:1)
您可以尝试:
$input = '100 r St Lazare, 75009 PARIS';
$words = explode(' ', $input);
$last = array_pop($words);
或
$last = $words[count($words) - 1];
答案 2 :(得分: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你发布的测试字符串很难......)
答案 3 :(得分:0)
正则表达式和explode
是可能的解决方案,但是,在我看来,最快的一个是substr
:
$last = substr($words, strrpos($words, " ")+1);
strrpos
返回最后一个空格的偏移量。这就是你所需要的一切。
答案 4 :(得分:-1)
你可以尝试
$text = "100 r St Lazare, 75009 PARIS";
$exploded = explode(" ",$text);
echo $exploded[count($exploded)-1]