PHP中奇怪的空白错误

PHP中奇怪的空白错误,php,str-replace,trim,Php,Str Replace,Trim,我有要格式化的电话号码 我有一个模式匹配器,它将数字分解成10位数的格式,然后应用破折号。 它大部分时间都有效。然而,我对某些数字有意见 $trimmed = trim(preg_replace('/\s+/', '', $v->cust_num)); $tendigit = str_replace(array( '(', ')','-',' ' ), '', $trimmed); $num = substr($tendigit,0,3)."-".substr($tendigit,3,3)

我有要格式化的电话号码

我有一个模式匹配器,它将数字分解成10位数的格式,然后应用破折号。 它大部分时间都有效。然而,我对某些数字有意见

$trimmed = trim(preg_replace('/\s+/', '', $v->cust_num));
$tendigit = str_replace(array( '(', ')','-',' ' ), '', $trimmed);
$num = substr($tendigit,0,3)."-".substr($tendigit,3,3)."-".substr($tendigit,6,4);
这将更改5555、555-5555或555-5555、555-5555或555-555-5555或555-555-5555 我的格式是555-555-5555

然而,我在数据库中发现了一些似乎不想改变的条目

其中一个坏条目就是这个。它在4前面包含两个空格

   4-035-0100
当它通过$trimmed运行时,我输出$tendigit…它输出

  40350100 
正如所料。但当我对它应用$num时。它可以追溯到

 4-035-0100
我至少希望是这样

 403-501-00
它似乎有一些隐藏的空白,我的preg_替换、trim和str_替换没有攻击性

有什么想法吗


谢谢

您可以稍微压缩一下代码:

$tendigit = preg_replace('/[^\d]/', '', $v->cust_num);
$num = substr($tendigit,0,3)."-".substr($tendigit,3,3)."-".substr($tendigit,6,4);
不过,您应该添加一些条件来检查电话号码是否也有10位数字:

$tendigit = preg_replace('/[^\d]/', '', $v->cust_num);
if(strlen($tendigit == 10)){
    $num = substr($tendigit,0,3)."-".substr($tendigit,3,3)."-".substr($tendigit,6,4);
} else {
    // catch your error here, eg 'please enter 10 digits'
}
第一行删除任何“非数字”[^\d]

条件语句检查$tendigit变量中是否有10位数字

如果确实如此,那么它将使用您的代码进行解析和格式化


如果没有,那么您可以捕获一个错误。

下面的代码有效,我已经用我们在注释中发现的特殊字符进行了尝试。基本上,正则表达式删除所有不是数字0-9的内容,然后使用原始格式

$trimmed = preg_replace('/\D+/', '', $v->cust_num);
$num = substr($trimmed,0,3)."-".substr($trimmed,3,3)."-".substr($trimmed,6,4);

它是UTF格式的吗?它前面可能有一些unicode符号。看看,试着用这个代替trim-$str=preg_replace'/^[\p{Z}\s]+|[\p{Z}\s]+$/u',$str;一个更好的解决方案可能是检查是否有10个数字,如果没有,将表单回退以重新输入strlen$tendigit对该值的结果是什么?请运行此代码并发布它的输出:foreachstr_split$v->cust_num as$char{echo$char.'='。ord$char。还有那些不工作的输出�=160�=194在数字前面。我猜这两个“空白”是这些字符?很好…减少到两行…我喜欢当有人输入一个6位数字或5位数字时会发生什么?它只是使之成为555-55或555-555。这很好,因为任何与555-555-5555不匹配的值都会被标记为无效,在批量上传Lead之后,用户会收到任何标记为无效的数字的警报。他们可以删除它,也可以更改它