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;
编辑;刷牙的时候想到了一个办法
由于 countryarr 将只有墨西哥,我可以 preg_replace 只替换一次。
我还必须将替换模式更改为 countryarr 的内爆。
现在剩下的是 state/city,下划线在前,一个或多个单词用下划线分隔。
所以用 space 和 trim 字符串替换下划线。
编辑2;睡了一觉,觉得匹配国家的数组会很大
所以我做了改变。
每个国家的首字母都是一个新的数组,代码只会在首字母相同的国家循环。
我有下一个字符串:
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;
编辑;刷牙的时候想到了一个办法
由于 countryarr 将只有墨西哥,我可以 preg_replace 只替换一次。
我还必须将替换模式更改为 countryarr 的内爆。
现在剩下的是 state/city,下划线在前,一个或多个单词用下划线分隔。
所以用 space 和 trim 字符串替换下划线。
编辑2;睡了一觉,觉得匹配国家的数组会很大
所以我做了改变。
每个国家的首字母都是一个新的数组,代码只会在首字母相同的国家循环。