Geoff
Geoff

Reputation: 6649

Mask a string with dashes in PHP

I have the following string:

$thetextstring = "jjfnj 948"

At the end I want to have:

echo $thetextstring; // should print jjf-nj948

So basically what I am trying to do is to remove the spaces from the string then separate the first 3 letters from the rest of the string with a -.

So far I have

$string = trim(preg_replace('/s+/', ' ', $thetextstring));

$result =  explode(" ", $thetextstring);

$newstring = implode('', $result);

print_r($newstring);

I have been able to join the words, but how do I add the separator after the first 3 letters?

Upvotes: 0

Views: 2089

Answers (6)

mickmackusa
mickmackusa

Reputation: 48091

Without knowing more about how your strings can vary, this is working solution for your task:

Pattern:

~([a-z]{2}) ~  // 2 letters (contained in capture group1) followed by a space

Replace:

-$1

Demo Link

Code: (Demo)

$thetextstring = "jjfnj 948";
echo preg_replace('~([a-z]{2}) ~','-$1',$thetextstring);

Output:

jjf-nj948

Note this pattern can easily be expanded to include characters beyond lowercase letters that precede the space. ~(\S{2}) ~

Upvotes: 2

Tommaso Belluzzo
Tommaso Belluzzo

Reputation: 23695

You proceeding is correct. For the last step, which consists in inserting a - after the third character, you can use the substr_replace function as follows:

$thetextstring = 'jjfnj 948';  
$string = trim(preg_replace('/\s+/', ' ', $thetextstring));
$result = explode(' ', $thetextstring);
$newstring = substr_replace(implode('', $result), '-', 3, false);

If you are confident enough that your string will always have the same format (characters followed by a whitespace followed by numbers), you can also reduce your computations and simplify your code as follows:

$thetextstring = 'jjfnj 948';  
$newstring = substr_replace(str_replace(' ', '', $thetextstring), '-', 3, false);

Visit this link for a working demo.

Upvotes: 1

Stv
Stv

Reputation: 506

Oldschool without regex

$test = "jjfnj 948";
$test = str_replace(" ", "", $test);  // strip all spaces from string
echo substr($test, 0, 3)."-".substr($test, 3);  // isolate first three chars, add hyphen, and concat all characters after the first three

Upvotes: 0

Kevin Kopf
Kevin Kopf

Reputation: 14230

$thetextstring = "jjfnj 948";

// replace all spaces with nothing
$thetextstring = str_replace(" ", "", $thetextstring);

// insert a dash after the third character
$thetextstring = substr_replace($thetextstring, "-", 3, 0);

echo $thetextstring;

This gives the requested jjf-nj948

Upvotes: 2

revo
revo

Reputation: 48761

Use a regex with preg_replace function, this would be a one-liner:

^.{3}\K([^\s]*) *

Breakdown:

^   # Assert start of string
.{3}    # Match 3 characters
\K  # Reset match
([^\s]*) * # Capture everything up to space character(s) then try to match them

PHP code:

echo preg_replace('~^.{3}\K([^\s]*) *~', '-$1', 'jjfnj 948');

PHP live demo

Upvotes: 4

sorak
sorak

Reputation: 2633

You can use str_replace to remove the unwanted space:

$newString = str_replace(' ', '', $thetextstring);

$newString:

jjfnj948

And then preg_replace to put in the dash:

$final = preg_replace('/^([a-z]{3})/', '\1-', $newString);

The meaning of this regex instruction is:

  • from the beginning of the line: ^
  • capture three a-z characters: ([a-z]{3})
  • replace this match with itself followed by a dash: \1-

$final:

jjf-nj948

Upvotes: 1

Related Questions