Solved

PHP/REGEX: find/replace values from array

Posted on 2009-05-15
10
1,297 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
  • 3
  • 2
  • 2
  • +2
10 Comments
 
LVL 109

Assisted Solution

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

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
Problems using Powershell and Active Directory?

Managing Active Directory does not always have to be complicated.  If you are spending more time trying instead of doing, then it's time to look at something else. For nearly 20 years, AD admins around the world have used one tool for day-to-day AD management: Hyena. Discover why

 
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

NAS Cloud Backup Strategies

This article explains backup scenarios when using network storage. We review the so-called “3-2-1 strategy” and summarize the methods you can use to send NAS data to the cloud

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…
Developers of all skill levels should learn to use current best practices when developing websites. However many developers, new and old, fall into the trap of using deprecated features because this is what so many tutorials and books tell them to u…
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…

770 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