如何格式化字符串的特定部分?
在这种情况下,我有一个表单要求用户提供一个地址,并将其作为我用$_POST
捕获的变量发布到php,并将其转换为我输出的变量,如下所示它看起来更干净:
$receive_address = ucwords(strtolower(str_replace('.','',$_POST['send_address'])));
地址将输入到这样的表格中......
100 john st。,toronto,on
...并以此输出......
100 John St,Toronto,On
如果我输入100 john st., toronto
,开启或100 john st., toronto, ontario
,我希望最终结果为:
100 John St,Toronto,ON
从字面上看,唯一的区别是最终结果将以2个字母结尾,大写。
我想更进一步,检查是否有" On"最后在那里,如果没有添加它,如果有,则将两个字母都大写。
这是否可行,这将如何运作?
我试图弄明白这一点:
function findProvCode($address_data) {
$prov_codes = array('NL','PE','NS','NB','QC','ON',' MB','SK','AB','BC','YT','NT','NU')
if (stripos($address_data, $prov_codes)) {
// still need to find out which of the prov codes it is...
// $specify_code = something to do with finding out which code this address already had
str_replace('$address_data',strtoupper($specify_code),$address_data);
}
}
这里是我迄今为止所在的PHP沙箱...有人发布了一些想法的答案但删除了它(假设因为它没有像他们预期的那样工作) ,这些想法很有用:http://sandbox.onlinephpfunctions.com/code/36f1e07e2e52573e230da4dda49320c564a818cd
工作流程似乎很简单......
1 - 检查省或省代码
2 - 如果是省代码,则大写
3 - 如果整个单词,则更改为省代码和大写省代码
不知道该怎么做。
我知道这实际上并不重要......我只是想学习如何以这种方式操纵字符串。
答案 0 :(得分:2)
在代码末尾执行此操作:
$address_string = "100 John St, Toronto, On";
$address_array = explode(',', $address_string);
array_push($address_array, strtoupper(array_pop($address_array)));
$address_string = implode(',', $address_array);
OR ,如果您更喜欢某个功能:
function CapProvCode($address_string){
$address_array = explode(',', $address_string);
array_push($address_array, strtoupper(array_pop($address_array)));
return implode(',', $address_array);
}
其中$ address_string是最后两个字母大写的字符串。
我在这里尝试了它们,我在echo $address_string;
100 John St,Toronto,ON
解释发生了什么:
explode函数每次找到','(分隔符)时都会中断字符串并将这些片段返回到数组中。所以,在第一行之后,$ address_array是:
Array
(
[0] => 100 John St
[1] => Toronto
[2] => On
)
在第二行,我们将分析一块一块。最内部的嵌套array_pop,取出$address_array
的最后一项,我们得到了这个
正在进行的第二行
array_push($address_array, strtoupper(" On"));
此时$ address_array的print_r()
Array
(
[0] => 100 John St
[1] => Toronto
)
现在函数strtoupper()将字符串“On”大写。在outter nest上,array_push插入大写在$address_array
的最后位置的字符串:
$ address_array的print_r()
Array
(
[0] => 100 John St
[1] => Toronto
[2] => ON
)
然后,在第三行,implode使爆炸的oposit,将数组的所有部分连接成一个字符串并用','分隔它们。就是这样!
使用正则表达式解决
要处理像100 John St, Toronto, On, Canada
这样的字符串的可能性,您必须处理Regular Expressions。它们真的不容易理解,甚至更难写,但绝对值得学习如何以及何时使用它们。在处理字符串模式时, Regex 非常有用。
Php具有使用 regex 替换字符串的本机函数:preg_replace()。看看这段代码吧,它应该可以解决问题:
$address_string[] = "100 John St, Toronto, On, Canada";
$address_string[] = "100 John St, Toronto, on, Canada";
$address_string[] = "100 John St, Toronto, On";
$address_string[] = "100 John St, Toronto, on";
foreach($address_string as $value){
echo preg_replace('/, [A-za-z]{2}(,|$)/e', 'strtoupper("$0")', $value);
echo "<br>";
}
我执行了它,输出是:
100 John St,Toronto,ON,Canada
100 John St,Toronto,ON,Canada
100 John St,Toronto,ON
100 John St,Toronto,ON
我希望它适用于所有情况。在尝试理解正则表达式时不要轻易放弃,他们真的很难。 This可以帮助您。
答案 1 :(得分:1)
你可以使用&#34;关系图&#34;数组以array('toronto' =>'ON', ...)
的方式定义某个城镇与哪个省相关:
function findProvCode($address_data) {
$prov_codes = array('toronto' =>'ON', 'NL','PE','NS','NB','QC','MB','SK','AB','BC','YT','NT','NU');
$words = explode(" ", ucwords($address_data));
$last_index = count($words) - 1;
if (in_array(strtoupper($words[$last_index]), $prov_codes)) {
$words[$last_index] = strtoupper($words[$last_index]);
} elseif (array_key_exists(strtolower($words[$last_index]), $prov_codes)) {
$words[] = $prov_codes[strtolower($words[$last_index])];
}
return implode(" ", $words);
}
echo findProvCode("100 john st., toronto, on") . "<br>";
echo findProvCode("100 john st., toronto");
输出:
100 John St., Toronto, ON
100 John St., Toronto ON
答案 2 :(得分:1)
由于你特别询问了字符串操作,这是使用(主要)字符串函数的一种方法。
$codes = array('NL','PE','NS','NB','QC','ON','MB','SK','AB','BC','YT','NT','NU');
$province = strtoupper(substr($address, -2)); // take last 2 chars and convert to UC
if (in_array($province, $codes)) { // try to find it in the codes array
$address = substr($address, 0, -2) . $province; // replace last 2 chars with UC version
}
不仅 字符串函数,因为我认为没有比in_array
更好的方法来验证字符串是某一组字符串的一部分。你可以做点什么
if (strpos('NL|PE|NS|NB|QC|ON|MB|SK|AB|BC|YT|NT|NU', $province) !== false) { ...
但无论使用哪个分隔符,将一个任意字符串与一个较长的字符串而不是一个字符串数组相匹配理论上会产生误报。