PHP:如何检查字符串中特定于大小写的部分?
如何格式化字符串的特定部分 在本例中,我有一个表单要求用户提供地址,它作为一个变量发布到php,我用PHP:如何检查字符串中特定于大小写的部分?,php,string,function,Php,String,Function,如何格式化字符串的特定部分 在本例中,我有一个表单要求用户提供地址,它作为一个变量发布到php,我用$\u POST捕获该变量,并将其转换为一个变量,输出如下所示,以使其看起来更清晰: $receive_address = ucwords(strtolower(str_replace('.','',$_POST['send_address']))); 地址将被输入如下表格中 伦敦多伦多约翰街100号 …并作为以下内容输出 伦敦多伦多约翰街100号 如果我在上输入多伦多约翰街100号或安大略省多
$\u POST
捕获该变量,并将其转换为一个变量,输出如下所示,以使其看起来更清晰:
$receive_address = ucwords(strtolower(str_replace('.','',$_POST['send_address'])));
地址将被输入如下表格中
伦敦多伦多约翰街100号
…并作为以下内容输出
伦敦多伦多约翰街100号
如果我在上输入多伦多约翰街100号或安大略省多伦多约翰街100号,我希望最终结果如下:
伦敦多伦多约翰街100号
字面上唯一的区别是,最终结果将以2个字母(大写)结束
我想更进一步,检查是否有一个“开”在那里结束,如果没有添加它,如果有,大写两个字母
这有可能吗?这将如何工作
下面是我试图弄明白的:
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沙箱,我目前所处的位置。。。有人发布了一个带有一些想法的答案,但删除了它(假设因为它没有按照他们预期的方式工作),尽管这些想法很有用:
工作流程似乎很简单
1-检查省或省代码
2-如果是省代码,请使用大写字母it
3-如果是全字,则更改为省代码和大写省代码
只是不知道怎么做
我知道这在现实中并不是那么重要。。。我只想学习如何以这种方式操作字符串。在代码末尾执行此操作:
$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);
或,如果您喜欢功能:
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\u字符串之后得到了以下输出代码>
伦敦多伦多约翰街100号
解释发生了什么:
函数每次找到“,”(分隔符)时都会打断字符串,并将片段返回到数组中。因此,在第一行之后,$address_数组是:
Array
(
[0] => 100 John St
[1] => Toronto
[2] => On
)
在第二行,我们将逐一分析。在最内部的嵌套中,取出$address\u数组的最后一项,我们得到了这个
第二行正在进行中
array_push($address_array, strtoupper(" On"));
此时打印$address\u数组的\r()
Array
(
[0] => 100 John St
[1] => Toronto
)
现在,函数strtoupper()将字符串“On”大写。在外部嵌套上,在$address\u数组的最后一个位置插入大写的字符串:
计算第二行后打印$address\u数组的值(
Array
(
[0] => 100 John St
[1] => Toronto
[2] => ON
)
然后,在第三行,使oposit of explode,将数组的所有部分连接成一个字符串,并用“,”分隔它们。就这样
使用正则表达式求解
array_push($address_array, strtoupper(" On"));
要处理像加拿大多伦多约翰街100号这样的字符串的可能性
,您必须处理。它们确实不容易理解,甚至更难编写,但确实值得学习如何以及何时使用它们。处理字符串模式时,正则表达式非常有用
Php有一个使用正则表达式替换字符串的本机函数:。看看这段代码,它应该可以做到:
$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>";
}
$address_string[]=“加拿大多伦多约翰街100号”;
$address_string[]=“加拿大多伦多约翰街100号”;
$address_string[]=“多伦多约翰街100号”;
$address_string[]=“多伦多约翰街100号”;
foreach($address\u字符串作为$value){
echo preg_replace('/,[A-za-z]{2}(,|$)/e','strtoupper($0'),$value);
回声“
”;
}
我执行了它,输出为:
加拿大多伦多约翰街100号
加拿大多伦多约翰街100号
伦敦多伦多约翰街100号
伦敦多伦多约翰街100号
我希望它适用于所有情况。在试图理解正则表达式时不要轻易放弃,它们真的很难。可以为您提供帮助。您可以使用“关系地图”数组来定义某个城镇与哪个省相关:
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");
因为您特别询问了字符串操作,所以这是使用(大部分)字符串函数进行操作的一种方法
$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
}
不仅仅是字符串函数,因为我认为没有比数组中的更好的方法来验证字符串是否是特定字符串集的一部分。你可以这样做
if (strpos('NL|PE|NS|NB|QC|ON|MB|SK|AB|BC|YT|NT|NU', $province) !== false) { ...
但不管使用什么分隔符,将任意字符串与较长字符串(而不是字符串数组)进行匹配理论上都会产生误报。请在这里发布一个示例,比如如果输入“something”,输出的类型应该是什么?@ameenulla0007 just updated check@Yuri我可以将整个内容大写,不过我只想大写国家代码。你只能替换字符串,因为你已经有代码和城市了。你甚至可以向一些MapAPI发送请求,但这比一个str_replace()
Wow要花更长的时间,谈谈提供一个比我想象的更短的答案,哈哈。。。而且它工作得很好。我真的不明白它是如何针对省代码的??“你能帮我理解吗?”马修我试着解释这个话题。如果您有任何问题,请点击这里!谢谢,很好的解释!但是,如果有人键入“加拿大多伦多约翰街100号”,那么它将改为大写加拿大,是否可以“搜索”省代码?@Matthew I添加了另一种解决方法,这次是搜索更多类型的字符串。解决方案并非微不足道。如果您使用的是php7,我想您必须在php7不支持正则表达式末尾的“\e”时进行更改。然而,在PHP5上,它可以很好地工作。实际上,这是您添加的一个非常好的解决方案。我要用这个!那么\e做什么呢?当然,我知道这很难有效地完成。。。例如,您建议删除最后2个c