16
$string = ":abc and :def have apples.";
$replacements = array('Mary', 'Jane');

should become:

Mary and Jane have apples.

Right now I'm doing it like this:

preg_match_all('/:(\w+)/', $string, $matches);

foreach($matches[0] as $index => $match)
   $string = str_replace($match, $replacements[$index], $string);

Can I do this in a single run, using something like preg_replace?

1
  • 2
    This is how you can do it with an associative array. Commented Feb 23, 2012 at 15:53

4 Answers 4

19

You could use preg_replace_callback with a callback that consumes your replacements one after the other:

$string = ":abc and :def have apples.";
$replacements = array('Mary', 'Jane');
echo preg_replace_callback('/:\w+/', function($matches) use (&$replacements) {
    return array_shift($replacements);
}, $string);

Output:

Mary and Jane have apples.
Sign up to request clarification or add additional context in comments.

Comments

9
$string = ":abc and :def have apples.";
$replacements = array('Mary', 'Jane');

echo preg_replace("/:\\w+/e", 'array_shift($replacements)', $string);

Output:

Mary and Jane have apples.

1 Comment

It's not supported from PHP 7.0.
8

Try this

$to_replace = array(':abc', ':def', ':ghi');
$replace_with = array('Marry', 'Jane', 'Bob');

$string = ":abc and :def have apples, but :ghi doesn't";

$string = strtr($string, array_combine($to_replace, $replace_with));
echo $string;

here is result: http://sandbox.onlinephpfunctions.com/code/7a4c5b00f68ec40fdb35ce189d26446e3a2501c2

1 Comment

This is the fastest solution because it doesn't use regex
3

For a Multiple and Full array replacement by Associative Key you can use this to match your regex pattern:

   $words=array("_saudation_"=>"Hello", "_animal_"=>"cat", "_animal_sound_"=>"MEooow");
   $source=" _saudation_! My Animal is a _animal_ and it says _animal_sound_ ... _animal_sound_ ,  _no_match_";


  function translate_arrays($source,$words){
    return (preg_replace_callback("/\b_(\w*)_\b/u", function($match) use ($words) {    if(isset($words[$match[0]])){ return ($words[$match[0]]); }else{ return($match[0]); } },  $source));
  }


    echo translate_arrays($source,$words);
    //returns:  Hello! My Animal is a cat and it says MEooow ... MEooow ,  _no_match_

*Notice, thats although "_no_match_" lacks translation, it will match during regex, but preserve its key. And keys can repeat many times.

2 Comments

I recommend to add "u" modifier to the regex for supporting UTF-8 strings: /\b_(\w*)_\b/u. BTW, code above has a syntax error, and extra parenthesis at the end.
Looks like no extra parenthesis issue, i verified the code and is running ok. BUt i added The UTf-8. Thank you

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.