2017-08-17 78 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中。问题是,如果下划线也将用于分隔具有多个单词的单词,如“美国”,则术语之间需要不同的分隔符。代码无法知道每个下划线是否表示单个术语内的术语分隔符或空格。

如果您将输入字符串与可能包含的可能术语(国家,州,城市等)列表进行比较,您可能可以完成此工作,但这将比单纯替换字符串要复杂得多。希望您能够修改这些字符串的存储或生成方式,以便他们使用不同的分隔符。