Smarty / PHP Regex取代

时间:2017-08-17 17:43:39

标签: php regex smarty

我有下一个字符串:

countries_united_states_ohio

有时它可以是countries_spain_madrid

如何删除“国家/地区”一词并输出下一个输出:
United States, Ohio

Spain, Madrid

我正在使用Smarty,我试过这样的事情:

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

问题在于它返回美国,国家(如预期的那样),我想我可以删除“国家/地区”这个词。使用substr。

任何人都有任何想法?

谢谢!

3 个答案:

答案 0 :(得分:0)

使用explode将其拆分为_

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

$ split现在将

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

然后你可以用它做你想要的,$ split [#]的位置,重组等等。

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

答案 1 :(得分:0)

如果countries_总是在开头,删除它会很容易,听起来你已经知道如何做到这一点。

但我不认为在Smarty或PHP中只使用字符串函数来正确分割字符串的其余部分。问题是,如果下划线也将用于分隔具有多个单词的单词,例如“美国”,则需要在术语之间使用不同的分隔符。代码无法知道每个下划线是否表示术语分隔符或单个术语中的空格。

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

答案 2 :(得分: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;现在我已经睡了一觉,我认为与国家相匹配的阵列会非常大 所以我做了一个改变 国家/地区的每个首字母都是一个新数组,代码只会在具有相同首字母的国家/地区循环播放。