2017-08-17 77 views
1

我的下一個字符串:的Smarty/PHP正則表達式替換

countries_united_states_ohio

有時也可以是countries_spain_madrid

如何刪除這個詞的國家,並有下一個輸出:
United States, Ohio

Spain, Madrid

我使用Smarty的和我想是這樣的:

{$string|replace:"_":", "|capitalize} 

的問題是,它返回美國,美國(如預期),我想我可以刪除單詞「國家」使用SUBSTR。

任何人有任何想法?

謝謝!

+0

你可以嘗試把它分成數組,然後抓住數組作爲城市中的最後一項,和所有其餘的認爲它是該國因此與空間投身其中的一部分。 – felixmosh

+1

PHP無法閱讀您的想法。你必須定義一些東西。要麼使用更好的分隔符(不能是您的國家字符串的一部分),要麼添加一個不應該被替換的下劃線的黑名單。 –

+0

對於Smarty來說,這不太合適。在PHP中進行字符串拆分,替換等,讓Smarty模板只處理大寫字母(它屬於表示層;其餘部分是數據操作)。 – axiac

回答

0

我想我找到了一種方法。
您將需要世界上所有國家的列表。例如:https://www.countries-ofthe-world.com/all-countries.html

的代碼將在字符串的每個部分,看看它是否是一個「國字」,如果真:
這將確保它不是已經抓住了那個詞(查看所有「uinited」的國家) 。
如果它不在國家數組中,則將其添加到那裏。

現在我只能破滅的國家。

國家/城市是剩下的我刪除國家和_

$Ucountries = ["Uganda", 
    "Ukraine", 
    "United Arab Emirates (UAE)", 
    "United Kingdom (UK)", 
    "United States of America (USA)", 
    "Uruguay", 
    "Uzbekistan"]; 

$Mcountries = ["Macedonia (FYROM)", 
    "Madagascar", 
    "Malawi", 
    "Malaysia", 
    "Maldives", 
    "Mali", 
    "Malta", 
    "Marshall Islands", 
    "Mauritania", 
    "Mauritius", 
    "Mexico", 
    "Micronesia", 
    "Moldova", 
    "Monaco", 
    "Mongolia", 
    "Montenegro", 
    "Morocco", 
    "Mozambique", 
    "Myanmar (Burma)"]; 

$str = "countries_mexico_mexico_city"; 
//$str = "countries_united_states_ohio"; 
$str = str_replace("countries_", "", $str); 

// Copy array needed to $CountryList 
$CountryList = ${strtoupper(substr($str,0,1)). "countries"}; 

$countryarr = array(); 
$arr = explode("_", $str); 

Foreach($arr as $val){ 
    Foreach($CountryList as $item){ 
     If(stripos($item, $val) !== false){ 
      If(!in_array($val, $countryarr)){ 
       $countryarr[] = $val; 
      } 
     } 
    } 
} 

$country = implode(" ", $countryarr); 
$state_city = preg_replace("/" . implode("_",$countryarr) . "/", "", $str,1); 
$state_city = trim(str_replace("_", " ", $state_city)); 

Echo $country . "\n" . $state_city; 

https://3v4l.org/POMPT

編輯;想到了我刷牙時的一種方式。
由於countryarr將只有墨西哥我可以與preg_replace只替換一次。
此外,我不得不將更換模式更改爲countryarr的內爆。
現在剩下的是一個首先用下劃線和一個或多個用下劃線分開的單詞的州/城市。
因此,用空格替換下劃線並修剪字符串。

EDIT2;現在我已經有了一些睡眠,我認爲與國家匹配的陣列會非常大。
所以我做了一個改變。
國家的每個首字母都是一個新數組,並且代碼只會在具有相同首字母的國家中循環。

+0

現在我想到了。像國家這樣的名稱會出現一些問題。像墨西哥城,墨西哥一樣。我要睡覺了,所以也許明天我會有一個解決方案。 – Andreas

+0

編輯修復墨西哥。 – Andreas

0

使用爆炸分裂它_

$textString = "countries_united_states_ohio"; 
$split = explode("_",$textString); 

$拆分現在將

$split = [countries,united,states,ohio]; 

然後,你可以用它做你想要什麼,$分割[#]的位置,再-assemble等

countries_spain_madrid

echo $split[1].",".$split[2]; 

輸出=>西班牙,馬德里

countries_united_states_ohio

echo $split[1]." ".$split[2].",".$split[3]; 

輸出=>美國的俄亥俄州

但這裏的問題是,你有它設置的方式,有沒有高效的編程方式來確定它是否是空格或分隔符來分割單詞(即, united_states或countries_span_madrid)。

如果你知道發生了什麼,你可以這樣算出來,但它仍然不是很有效率,它意味着你基本上靜態地做它或者確定它的特定單詞,這意味着它是一組單詞的一組單詞美國)或單一世界

您可以嘗試使用不同的分隔符來分隔空格與分詞。也許_空間和 - 分裂。就像說united_states-ohio

0

如果countries_總是在開始,那麼刪除就夠簡單了,聽起來你已經知道如何做到這一點。

但我不認爲分開正確的字符串的其餘部分將可能只使用字符串函數,一般在Smarty或PHP中。問題是,如果下劃線也將用於分隔具有多個單詞的單詞,如「美國」,則術語之間需要不同的分隔符。代碼無法知道每個下劃線是否表示單個術語內的術語分隔符或空格。

如果您將輸入字符串與可能包含的可能術語(國家,州,城市等)列表進行比較,您可能可以完成此工作,但這將比單純替換字符串要複雜得多。希望您能夠修改這些字符串的存儲或生成方式,以便他們使用不同的分隔符。