2017-07-13 70 views
0

考慮到這一輸入字符串:如何獲得最後一個字的索引以大寫字母在PHP

「這是一個測試字符串獲取單詞的最後一個索引在PHP中的大寫字母」

我怎樣才能得到最後的大寫字母的位置(在這個例子中,第一個「P」(不是最後一個「PHP」字的「P」)?

+0

你說「我可以得到最後一個大寫字母的位置」,在括號中提到了不是最後一個大寫字母的「PHP」字的第一個「P」。那麼你真的需要什麼?此外,你有沒有嘗試過分享? –

+0

這似乎工作https://regex101.com/r/KkJeho/1 – Andreas

+0

等等..你是什麼意思的位置?就像你從strpos中得到的字符數?你爲什麼要標記這個正則表達式?正則表達式不會給你一個計數 – Andreas

回答

4

的位置,我認爲這正則表達式請試試看。

https://regex101.com/r/KkJeho/1

$pattern = "/.*\s([A-Z])/"; 
//$pattern = "/.*\s([A-Z])[A-Z]+/"; pattern to match only all caps word 

編輯解決什麼Wiktor的評論中寫道:我想你可以str_replace函數所有新線與空間的正則表達式輸入字符串。
這應該使正則表達式將其視爲單行正則表達式,並仍然給出正確的輸出。
雖然未經測試。

要查找信/字的位置:

$str = "this is a Test String to get the last index of word with an uppercase letter in PHP"; 

$pattern = "/.*\s([A-Z])(\w+)/"; 
//$pattern = "/.*\s([A-Z])([A-Z]+)/"; pattern to match only all caps word 

preg_match($pattern, $str, $match); 


$letter = $match[1]; 
$word = $match[1] . $match[2]; 
$position = strrpos($str, $match[1].$match[2]); 

echo "Letter to find: " . $letter . "\nWord to find: " . $word . "\nPosition of letter: " . $position; 

https://3v4l.org/sJilv

+0

'「/.* \ s([A-Z])/」'將起作用,除非該字符串是多行的,並且最後一個大寫的*字不在第一行。或者,如果大寫的單詞前面加上了空格以外的非單詞字符。順便說一句,不OP只想匹配ALLCAPS單詞? –

+0

@Wiktor true。但我不知道OP想要什麼。他還說「職位」,這使得reges或多或少無用。 – Andreas

+0

@Wiktor我想我已經解決了你的兩個擔憂:-) – Andreas

3

如果您還需要考慮一個非正則表達式的版本:您可以嘗試在空白字符分割字符串,迭代返回結果字符串數組,並檢查當前字符串的第一個字符是否爲大寫字符,如下所示(您可能想要添加索引/空值檢查):

<?php  

$str = "this is a Test String to get the last index of word with an uppercase letter in PHP"; 
$explodeStr = explode(" ",$str); 
$i = count($explodeStr) - 1; 
$characterCount=0; 
while($i >= 0) { 
    $firstChar = $explodeStr[$i][0]; 
    if($firstChar == strtoupper($firstChar)){ 
     echo $explodeStr[$i]. ' at index: '; 
     $idx = strlen($str)-strlen($explodeStr[$i] -$characterCount); 
     echo $idx; 
     break; 
    } 
    $characterCount += strlen($explodeStr[i]) +1; //+1 for whitespace 
    $i--; 
} 

這將打印80這確實是PHP(包括空格)中第一個P的索引。

+1

我覺得這是一個很好的答案。爲什麼它低調?它實際上給了我的位置,而我沒有。這是免費的正則表達式(除非它是一個高字符串)可能使它更快。來自我的+1! – Andreas

+0

我猜是因爲這個問題實際上被標記爲正則表達式..但謝謝! :) – eol

+0

OP在我看來並不決定方法。如果是這樣的話,那麼會有數百個線程在解析html時使用正則表達式的答案。但沒有。 – Andreas

0

安地列斯的格局看起來非常穩固,但這會發現位置更快...

.* \K[A-Z]{2,} 

Pattern Demo

下面是PHP實現:Demo

​​

如果你想看到一個精簡的非正則表達式方法,這將會工作:

代碼:Demo

$str='this is a Test String to get the last index of word with an uppercase letter in PHP test'; 
$allcaps=array_filter(explode(' ',$str),'ctype_upper'); 
echo "Position = ",strrpos($str,end($allcaps)); 

輸出:

Position = 80 

這假定有輸入字符串的全部大寫的單詞。如果有可能沒有全部大寫的單詞,那麼一個條件將會把它整理出來。


編輯,重新閱讀的問題後,我不確定是什麼讓PHP目標串 - 無論它是因爲它是全部大寫,或者只是最後一個字開始一個大寫字母。

如果只是最後一個字開頭的大寫字母那麼這種格局將做到:/.* \K[A-Z]/

如果字必須全部大寫,則有可能是/b單詞邊界可能是必要的。

一些更多的樣本和說明從OP將是有益的。


另一個編輯,你可以聲明一組字符來排除和使用兩個字符串函數。我使用a-zrtrim(),然後找到最右側的空間,並將1添加到它。

$str='this is a Test String to get the last index of word with an uppercase letter in PHP test'; 
echo strrpos(rtrim($str,'abcdefghijklmnopqrstuvwxyz '),' ')+1; 
// 80 
相關問題