开发者

Replace all certain character except first occurrence in PHP

Example


You could make use substr() and str_replace() fairly easily:

$str = '1.1.0.1';
$pos = strpos($str,'.');
if ($pos !== false) {
    $str = substr($str,0,$pos+1) . str_replace('.','',substr($str,$pos+1));
}
echo $str;


$s = preg_replace('/((?<=\.)[^.]*)\./', '$1', $s);

Matches zero or more non-dot characters followed by a dot, but only if the match was preceded by a dot. This prevents a match on the initial digit(s). Replaces the match with only the non-dot characters (the digits), which were captured in group #1.


$input="1.1.1.1";
$s = explode(".",$input ) ;
$t=array_slice($s, 1);
print implode(".",array($s[0] , implode("",$t)) );

or

$input="1.1.1.1";
$s = explode(".",$input ,2) ;
$s[1]=str_replace(".","",$s[1]);
print implode(".",array($s[0] ,$s[1] ) );


  1. Match&Release the first occurring literal dot
  2. Replace all subsequent literal dots

Code: (Demo)

echo preg_replace('~^[^.]*\.(*SKIP)(*FAIL)|\.~', '', $string);
// 1.101

Or with the "continue" character (\G), consume and forget the first literal dot, then replace all subsequent literal dots.

Code: (Demo)

echo preg_replace('~(?:^[^.]*\.|\G(?!^))[^.]*\K\.~', '', $string);
// 1.101

Or simply check that a literal dot has a literal dot occurring earlier in the string.

Code: (Demo)

echo preg_replace('~(?<=\.)[^.]*\K\.~', '', $string);
// 1.101


I though substr_replace() would work here, but sadly no... Here is a regex approach:

$str = preg_replace('~(\d+\.)(\d+)\.(\d+)\.(\d+)~', '$1$2$3$4', $str);


You could also try the below regex with s switch,

<?php
$string = '1.1.0.1';
$pattern = "/(?s)((?<=\.).*?)(\.)/i";
$replacement = "$1";
echo preg_replace($pattern, $replacement, $string);
?>

Output:

1.101


Using regex matches can be clearer by depicting the desired result and avoids the error-prone approach of calls to substr and strpos. Here I assume that no text is required before the first dot, i.e., that an input may begin with a dot that must be preserved. The difference is whether a quantifier of * or + is appropriate in the patterns below.

If your inputs will always be short, a straightforward approach is to replace trailing dots until none remain:

$count = 0;
$output = $input;
do {
    $output = preg_replace('/^(.*\.)(.+)\./', '$1$2', $output, -1, $count);
} while ($count != 0);
echo $output;

To do it with a single regex match, use preg_replace_callback to apply a function (str_replace in this case) to the backreference variable $2.

$output = preg_replace_callback(
  '/^([^.]*\.)(.+)$/',
  function ($m) { return $m[1] . str_replace('.', '', $m[2]); },
  $input);

Sample results:

1.1.0.1 - 1.101
.1.0.1  - .101
111     - 111
1.1     - 1.1
1.      - 1.
.1      - .1
.1.     - .1
....    - .

You may want to experiment with the code and test cases at Try It Online!

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜