Solved

PHP/REGEX: find/replace values from array

Posted on 2009-05-15
10
1,317 Views
Last Modified: 2012-08-14
Hello,

I want to use PHP/REGEX to find and replace in $config old values with new values.

My new values are in an array:

$newValues = array('type'=> 'FlatFile', 'type'=> 'FlatFile', 'server'=> '22.22.22.22', 'username'=> 'justme');

My old values are in this format:
      "type" => "MySQLDatabase",
      "server"=>"localhost",
      "username" => "myname",
      "password"    =>  "mypass",
      "database"       =>     "mydb",


So for each item in the array I need to find the old value and replace it with the new.


$newValues = array('type'=> 'FlatFile', 'type'=> 'FlatFile', 'server'=> '22.22.22.22', 'username'=> 'justme');
 
/// This:
	"type" => "MySQLDatabase",
	"server"=>"localhost", 
	"username" => "myname", 
	"password"    =>  "mypass", 
	"database"	 =>     "mydb",
 
// Should be updated to become this:
	"type" => "FlatFile",
	"server"=>"22.22.22.22", 
	"username" => "justme", 
	"password"    =>  "mypass", 
	"database"	 =>     "mydb",

Open in new window

0
Comment
Question by:hankknight
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
  • 2
  • +2
10 Comments
 
LVL 110

Assisted Solution

by:Ray Paseur
Ray Paseur earned 80 total points
ID: 24399185
I would use a foreach iterator to do this.
0
 
LVL 110

Expert Comment

by:Ray Paseur
ID: 24399204

<?php // RAY_temp_hank.php
error_reporting(E_ALL);
 
// FROM THE OP
$newValues = array('type'=> 'FlatFile', 'type'=> 'FlatFile', 'server'=> '22.22.22.22', 'username'=> 'justme');
 
// OLD ARRAY
$old = array(
        "type" => "MySQLDatabase",
        "server"=>"localhost",
        "username" => "myname",
        "password"    =>  "mypass",
        "database"       =>     "mydb"
    );
 
// COPY ARRAY
$new = $old;
 
// REPLACE VALUES
foreach ($newValues as $key => $val)
{
    $new[$key] = $val;
}
 
// SHOW INPUT AND OUTPUT
echo "<pre>\n";
var_dump($old);
var_dump($new);

Open in new window

0
 
LVL 1

Assisted Solution

by:dreamluverz
dreamluverz earned 20 total points
ID: 24412019
here's a nice guide in using regex and php http://dreamluverz.com/developers-tools/regex/regex
0
Online Training Solution

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action. Forget about retraining and skyrocket knowledge retention rates.

 
LVL 27

Expert Comment

by:ddrudik
ID: 24413874
hankknight, ray seemed to have it, did that work for you?
0
 
LVL 16

Author Comment

by:hankknight
ID: 24419925
Thank you all for your comments.  Ray's idea is not what I am looking for.  Perhaps I did not write my question clearly.  

$config is a STRING and not a PHP script.  So regex is needed.

My code below demonstrates what I am looking for.  It requires the kind of regex that ddrudik creates in his sleep.
<?php
 
$config_code = ' 
	"type" => "MySQLDatabase",
	"username" => "myname", 
	"database"	 =>     "mydb",
	"server"=>"localhost", 
	"password"    =>  "mypass", 
';
 
$newValues = array('type'=> 'FlatFile', 'type'=> 'FlatFile', 'server'=> '22.22.22.22', 'username'=> 'justme');
 
foreach ($newValues as $key => $val) {
   $config_code = preg_replace('Find the corsponding values of $key)', $val, $config_code);
}
 
file_put_contents('new_config.php', $config_code);
 
?>

Open in new window

0
 
LVL 27

Accepted Solution

by:
ddrudik earned 400 total points
ID: 24420325
For that you might consider:
   $config_code = preg_replace("/(\"$key\"(?:(?!=>).)*)=>([^,]*)/","$1 => \"$val\"",$config_code);

Open in new window

0
 
LVL 40

Expert Comment

by:Richard Quadling
ID: 24420608
If you are on PHP 5.3.0, then here is a working method using closures. Ok. This is me showing off. Personally a simple foreach() loop would have been fine.



<?php
$config_code = '
        "type" => "MySQLDatabase",
        "server"=>"localhost", 
        "username" => "myname", 
        "password"    =>  "mypass", 
        "database"       =>     "mydb",
';
 
$wanted_code = '
        "type" => "FlatFile",
        "server"=>"22.22.22.22", 
        "username" => "justme", 
        "password"    =>  "mypass", 
        "database"       =>     "mydb",
';
 
$newValues = array
	(
	'type'     => 'FlatFile',
	'type'     => 'FlatFile',
	'server'   => '22.22.22.22',
	'username' => 'justme',
	);
 
array_walk
	(
	$newValues,
	function($Value, $Key) use(&$config_code)
		{
		$config_code = preg_replace
			(
			"`\"{$Key}\"(\s*=>\s*)\"[^\"]+\",`",
			"\"{$Key}\"\\1\"{$Value}\",",
			$config_code
			);
		}
	);
 
/* array_map variant */
/*array_map(
	function($Value, $Key) use(&$config_code)
		{
		$config_code = preg_replace
			(
			"`\"{$Key}\"(\s*=>\s*)\"[^\"]+\",`",
			"\"{$Key}\"\\1\"{$Value}\",",
			$config_code
			);
		},
	$newValues,
	array_keys($newValues)
	);
*/	
echo $config_code, PHP_EOL;
 
echo $config_code === $wanted_code ? 'Matches' : 'Different';
// file_put_contents('new_config.php', $config_code);

Open in new window

0
 
LVL 16

Author Comment

by:hankknight
ID: 24420898
RQuadling, interesting idea but to comlicated for me right now.

ddrudik, once again you have created perfect regex.  
0
 
LVL 40

Expert Comment

by:Richard Quadling
ID: 24421139
Of course. The foreach() loop is fine. Just showing off and hopefully giving those that are on the cutting edge of PHP a little extra.
0
 
LVL 27

Expert Comment

by:ddrudik
ID: 24422270
Thanks for the question and the points.

Here's another option for those seeking an alternative PHP solution (still not preferred over the regex method given the lack of security inherent to eval):
<pre>
<?php
 
$config_code = ' 
	"type" => "MySQLDatabase",
	"username" => "myname", 
	"database"	 =>     "mydb",
	"server"=>"localhost", 
	"password"    =>  "mypass", 
';
 
$newValues = array('type'=> 'FlatFile', 'type'=> 'FlatFile', 'server'=> '22.22.22.22', 'username'=> 'justme');
eval("\$oldValues=array($config_code);");
foreach ($newValues as $key => $val) {
     $oldValues[$key] = $val;
}
 
echo print_r($oldValues,true);
?>

Open in new window

0

Featured Post

PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Foreword (July, 2015) Since I first wrote this article, years ago, a great many more people have begun using the internet.  They are coming online from every part of the globe, learning, reading, shopping and spending money at an ever-increasing ra…
Introduction This article is intended for those who are new to PHP error handling (https://www.experts-exchange.com/articles/11769/And-by-the-way-I-am-New-to-PHP.html).  It addresses one of the most common problems that plague beginning PHP develop…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
The viewer will learn how to create and use a small PHP class to apply a watermark to an image. This video shows the viewer the setup for the PHP watermark as well as important coding language. Continue to Part 2 to learn the core code used in creat…

724 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question