Solved

PHP/REGEX: find/replace values from array

Posted on 2009-05-15
10
1,286 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 108

Assisted Solution

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

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
 
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
Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

 
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:RQuadling
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:RQuadling
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

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

I imagine that there are some, like me, who require a way of getting currency exchange rates for implementation in web project from time to time, so I thought I would share a solution that I have developed for this purpose. It turns out that Yaho…
These days socially coordinated efforts have turned into a critical requirement for enterprises.
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
This tutorial will teach you the core code needed to finalize the addition of a watermark to your image. The viewer will use a small PHP class to learn and create a watermark.

760 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

Need Help in Real-Time?

Connect with top rated Experts

23 Experts available now in Live!

Get 1:1 Help Now