仅替换字符串中的所有点,而不替换数值中的所有点


Replace all dot only in string, but not in numeric values

我想替换字符串中出现的所有点(.),而不是数字或数值。我举了个例子

STRING : 10.10.2015 11.30 09/2007 83 HELLO.HOW.ARE.YOU $.###
OUTPUT : 10.10.2015 11.30 09/2007 83 HELLO HOW ARE YOU $ ###

我尝试在 php 中使用 preg_replace

使用非捕获后看组来测试前一个字符是否为数字

$string = '10.10.2015 11.30 09/2007 83 HELLO.HOW.ARE.YOU $.###';
$result = preg_replace('/(?<=[^'d])'./', ' ', $string);
var_dump($result);

解释

(?<=[^'d])'.
 -------- --
     ^    ^
     |    |
     |    ------------------  Escape the `.` so we're working with a literal
     |                          dot rather than "any character"
     |
     -----------------------  Look for any preceding non-digit character
                                but don't include it in the replace group

我不是preg_replace大师,所以我写了一个函数,它会将您的字符串拆分为数组,然后检查是否存在任何.,如果它找到一个点,它将检查,如果点位于 2 个数字之间。如果是,我的函数将.替换为

function removeDots($string) {
    $arr = str_split($string);
    foreach($arr as $key => $val) {
        if($val == ".") {
            if(!is_numeric($arr[$key-1]) && !is_numeric($arr[$key+1])) {
                $arr[$key] = " ";
            }
        }
    }
    return implode($arr);
}

结果如下:

$str = "STRING : 10.10.2015 11.30 09/2007 83 HELLO.HOW.ARE.YOU $.###";
echo removeDots($str);

输出:

字符串 : 10.10.2015

11.30 09/2007 83 你好,你好吗 $ ###