2015-08-18 32 views
-3

我想從PHP中的字符串中獲取2個字母的國家代碼。如何從字符串中獲取2個字母的國家代碼在PHP中

例如:

  1. Lazada-SG-IOS-非Incent_IMRO33811 - SG

  2. 科博啓動的Android BR,IN,ID,IQ,美國Incent(上限) - BR,IN, ID,IQ,美國

  3. Beintoo-Jumia-Andoid-NG-混合Incent_IMRO27929 - NG

  4. 勇者前線 - 安卓AU/CA/US/UK Incent CPE - AU,CA,美國,英國

  5. MU產地的Android KR非incent - KR,MU

  6. GS購買Android | IMRO37088 | KR - 非Incent - KR

  7. Zalando_DK_android_nonincent_IMRO35303 - DK

+0

我認爲你需要更精確的想要什麼。你知道字符串可能是什麼樣子嗎?你想要字符串中的任何國家代碼嗎?當它是毛里求斯的國家代碼時,爲什麼不應該包含「Mu」? – Anders

+0

畝產地是產品...我們不能通過計劃猜測其國家代碼或產品。讓我們把它視爲國家代碼 –

+0

是什麼使它成爲產品而不是國家代碼?這是關於在字符串中的位置的東西嗎?除非你給我們某種規則,什麼時候產品是什麼東西,什麼時候是國家代碼,那麼解決這個問題實際上是不可能的。這裏沒有人讀心意。 – Anders

回答

1

該函數將返回與任何國家代碼數組,在上例,每邊一個非字母數字字符:

function getCountryCodes($input) { 

    //An array with all the country codes. 
    //You will have to add more yourself. 
    static $country_codes = array('BR','IN','ID','IQ','US','MU','KR'); 

    //Creates a regex pattern like ""/(?<=[^a-zA-Z0-9])(?:BR|IN|ID|IQ|US|MU|KR)(?=[^a-zA-Z0-9])/". 
    static $pattern = '/(?<=[^a-zA-Z0-9])(?:' . implode('|', $country_codes) . ')(?=[^a-zA-Z0-9])/'; 

    //Find any matches for the pattern. 
    preg_match_all($pattern, $input, $matches); 

    //Return the result. 
    return $matches[0]; 

} 

讓我們打破正則表達式:

  • (?<=[^a-zA-Z0-9]):回顧後的任何不是字母數字的。
  • (?:BR|IN|ID|IQ|US|MU|KR):匹配任何|定界替代品,但不捕獲到子組(由於?:)。
  • (?=[^a-zA-Z0-9]):預測任何不是字母數字的東西。

關於國家和地區代碼的完整列表,請參閱Wikipedia

+1

是的....它的工作原理 –

0

的每一行,做

preg_match_all('/\b([A_Z]{2}([^A_Za-z]([A_Z]{2})))*\b/', $string, $sets, PREG_SET_ORDER); 
$array = array(); 
foreach ($sets as $matches) { 
    $array = array_merge($array, preg_split('/[^A-Z]/', $matches[1])); 
} 

你得到的可能存在國家代碼的數組。然後可以根據有效的國家/地區代碼列表來檢查該數組。

+0

這不會捕獲不屬於國家代碼的兩個字母單詞,比如'AK'嗎? – Anders

+1

是的,它會匹配任何兩個字母的大寫字母。 – syck

相關問題