Smarty/PHP 正则表达式替换

Smarty/PHP Regex replace

我有下一个字符串:

countries_united_states_ohio

有时可以countries_spain_madrid

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

Spain, Madrid

我正在使用 Smarty,我试过这样的方法:

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

问题是 returns United,States(正如预期的那样),我想我可以使用 substr.

删除 'countries' 这个词

有人知道吗?

谢谢!

使用 explode 在 _

上拆分它
$textString = "countries_united_states_ohio";
$split = explode("_",$textString);

$split 现在将是

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

然后就可以随心所欲了,$split[#]一个位置,re-assemble,等等

countries_spain_madrid

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

正在输出 => 西班牙,马德里

countries_united_states_ohio

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

正在输出 => 美国,俄亥俄州

但这里的问题是你设置它的方式,没有有效的编程方法来确定它是 space 还是分割单词的分隔符(即 united_states 或 countries_span_madrid).

如果你知道发生了什么,你可以像那样弄清楚,但它仍然不是很有效,这意味着你基本上是静态地做它或确定特定的词,它表示它是一个词的一组词(美国)或单一世界

您可以尝试对 space 和分词使用不同的分隔符。也许 _ 用于 space 和 - 用于拆分。比如说 united_states-ohio

如果 countries_ 总是在开头,删除它会很容易,而且听起来您已经知道该怎么做了。

但我认为在 Smarty 或 PHP 中仅使用字符串函数无法正确拆分字符串的其余部分。问题是,如果下划线也将用于分隔具有多个单词的单词,例如 "united states",那么您需要在单词之间使用不同的分隔符。代码无法知道每个下划线是表示术语分隔符还是单个术语中的 space。

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

我想我找到了方法。
您将需要一份世界上所有国家/地区的列表。示例:https://www.countries-ofthe-world.com/all-countries.html

代码将查看字符串的每个部分,看看它是否是 "country word" 如果为真:
它将确保它还没有抓住那个词(查看所有 "uinited" 个国家)。
如果它不在 country 数组中,则将其添加到那里。

现在我可以炸毁这个国家了。

State/city 是我删除国家和 _ 的剩余部分。

$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 的内爆。
现在剩下的是 state/city,下划线在前,一个或多个单词用下划线分隔。
所以用 space 和 trim 字符串替换下划线。

编辑2;睡了一觉,觉得匹配国家的数组会很大
所以我做了改变。
每个国家的首字母都是一个新的数组,代码只会在首字母相同的国家循环。