如果特定正则表达式匹配则修改字符串

时间:2016-06-11 07:49:55

标签: php regex string split

在PHP中工作,我有以下模拟字符串。

"width 40cm height 70cm"

如果字符串不包含冒号并且后面跟一个数字有空格,我想在该空格之前添加一个冒号。

我要找的最终结果是:

"width: 40cm height: 70cm"

我尝试了一些使用正则表达式的方法并在匹配时拆分字符串以添加冒号,但它正在删除匹配字符串。这是我的尝试。

    if(strpos($s, ':') === false) {
        $array = preg_split('/([0-9])/', $s, -1, PREG_SPLIT_NO_EMPTY);
        $array[0] = trim($array[0]) . ':';
        $s = implode('', $array);
    }

4 个答案:

答案 0 :(得分:1)

我认为这会起作用

(\w+)(?=\s+\d)
     <------->
     Lookahead to match
     space followed by 
     digits

<强> Regex Demo

PHP代码

$re = "/(\\w+)(?=\\s+\\d)/m"; 
$str = "width 40cm height 70cm\nwidth: 40cm height 70cm"; 

$result = preg_replace($re, "$1:", $str);
print_r($result);

<强> Ideone Demo

答案 1 :(得分:1)

以下正则表达式可能适合您:

/(?<!:)(?= \d)/g

替换::

$output = preg_replace('/(?<!:)(?= \d)/', ':', $input);

它匹配空格和数字(?= \d)之前的位置,而不是冒号(?<!:)。这就是为什么替换组只能是冒号的原因。

这称为lookarounds。以下两者均使用positive lookahead (?=...)negative lookbehind(?<!...)

https://www.regex101.com/r/oH7cI3/1

答案 2 :(得分:1)

使用lookarounds:

(?<=[a-z]) # a-z behind
\          # a space
(?=\d)     # a digit ahead

参见a demo on regex101.com并用冒号替换出现的事件。

答案 3 :(得分:0)

$string="width: 40cm height: 70cm";

$temp=exploade(" ",$string);

foreach($temp as $value){

if(strstr($value,'width') && strstr($value,'height')){
    $new_temp[]=$value.":";
}else{
    $new_temp[]=$value;
}

} $new_string=implode(" ", $new_temp);