Home > Software engineering >  How to replace all occurrences of a character except the first one in PHP using a regular expression
How to replace all occurrences of a character except the first one in PHP using a regular expression

Time:08-12

Given an address stored as a single string with newlines delimiting its components like:

1 Street\nCity\nST\n12345

The goal would be to replace all newline characters except the first one with spaces in order to present it like:

1 Street
City ST 12345

I have tried methods like:

[$street, $rest] = explode("\n", $input, 2);
$output = "$street\n" . preg_replace('/\n /', ' ', $rest);

I have been trying to achieve the same result using a one liner with a regular expression, but could not figure out how.

CodePudding user response:

I would suggest not solving this with complicated regex but keeping it simple like below. You can split the string with a \n, pop out the first split and implode the rest with a space.

<?php

$input = explode("\n","1 Street\nCity\nST\n12345");

$input = array_shift($input) . PHP_EOL . implode(" ", $input);

echo $input;

Online Demo

CodePudding user response:

You could use a regex trick here by reversing the string, and then replacing every occurrence of \n provided that we can lookahead and find at least one other \n:

$input = "1 Street\nCity\nST\n12345";
$output = strrev(preg_replace("/\n(?=.*\n)/", " ", strrev($input)));
echo $output;

This prints:

1 Street
City ST 12345

CodePudding user response:

You can use a lookbehind pattern to ensure that the matching line is preceded with a newline character. Capture the line but not the trailing newline character and replace it with the same line but with a trailing space:

preg_replace('/(?<=\n)(.*)\n/', '$1 ', $input)

Demo: https://onlinephp.io/c/5bd6d

CodePudding user response:

You can use an alternation pattern that matches either the first two lines or a newline character, capture the first two lines without the trailing newline character, and replace the match with what's captured and a space:

preg_replace('/(^.*\n.*)\n|\n/', '$1 ', $input)

Demo: https://onlinephp.io/c/2fb2f

CodePudding user response:

I leave you another method, the regex is correct as long as the conditions are met, in this way it always works

$string=explode("/","1 Street\nCity\nST\n12345");

$string[0]."<br>";
$string[1]." ".$string[2]." ".$string[3]
  • Related