Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:如何检查字符串中特定于大小写的部分?_Php_String_Function - Fatal编程技术网

PHP:如何检查字符串中特定于大小写的部分?

PHP:如何检查字符串中特定于大小写的部分?,php,string,function,Php,String,Function,如何格式化字符串的特定部分 在本例中,我有一个表单要求用户提供地址,它作为一个变量发布到php,我用$\u POST捕获该变量,并将其转换为一个变量,输出如下所示,以使其看起来更清晰: $receive_address = ucwords(strtolower(str_replace('.','',$_POST['send_address']))); 地址将被输入如下表格中 伦敦多伦多约翰街100号 …并作为以下内容输出 伦敦多伦多约翰街100号 如果我在上输入多伦多约翰街100号或安大略省多

如何格式化字符串的特定部分

在本例中,我有一个表单要求用户提供地址,它作为一个变量发布到php,我用
$\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