Lets say I have an array:
$myarray = ( [0] => 'Johnny likes to go to school', [1] => 'but he only likes to go on Saturday', [2] => 'because Saturdays are the best days', [3] => 'unless you of course include Sundays', [4] => 'which are also pretty good days too.', [5] => 'Sometimes Johnny likes picking Strawberrys', [6] => 'with his mother in the fields', [7] => 'but sometimes he likes picking blueberries' );
Keeping the structure of this array intact, I want to be able to replace phrases within it, even if they spill over to the next or previous string. Also I don’t want punctuation or case to impact it.
Examples:
String to Find: “Sundays which are also pretty good”
Replace with: “Mondays which are also pretty great”
After replace:
$myarray = ( [0] => 'Johnny likes to go to school', [1] => 'but he only likes to go on Saturday', [2] => 'because Saturdays are the best days', [3] => 'unless you of course include Mondays', [4] => 'which are also pretty great days too.', [5] => 'Sometimes Johnny likes picking Strawberrys', [6] => 'with his mother in the fields', [7] => 'but sometimes he likes picking blueberries' );
Curious if there is an ideal way of doing this. My original thought was, I would turn the array into a string, strip out punctuation and spaces, count the characters and replace the phrase based on the character count. But, it is getting rather complex, but it is a complex problem
Advertisement
Answer
This is a job for regular expressions.
The method I used was to implode
the array with some glue
(i.e. '&'
). Then I generated a regular expression by inserting a zero-or-one check for '&'
in between each character in the find string.
I used the regular expression to replace occurrences of the string we were looking for with the replacement string. Then I explode
d the string back into an array using the same delimiter as above ('&'
)
$myarray = [ 0 => 'Johnny likes to go to school', 1 => 'but he only likes to go on Saturday', 2 => 'because Saturdays are the best days', 3 => 'unless you of course include Mondays', 4 => 'which are also pretty great days too.', 5 => 'Sometimes Johnny likes picking Strawberrys', 6 => 'with his mother in the fields', 7 => 'but sometimes he likes picking blueberries' ]; // preg_quote this because we're looking for the string, not for a pattern it might contain $findstring = preg_quote("Sundays which are also pretty good"); // htmlentities this in case it contains a string of characters which happen to be an html entity $replacestring = htmlentities("Mondays which are also pretty great"); // Combine array into one string // We use htmlentitles to escape the ampersand, so we can use it as a sentence delimeter $mystring = implode("&", array_map('htmlentities', $myarray)); // Turns $findString into: // S&?u&?n&?d&?a&?y&?s&? &?w&?h&?i&?c&?h&? &?a&?r&?e&? // &?a&?l&?s&?o&? &?p&?r&?e&?t&?t&?y&? &?g&?o&?o&?d $regexstring = implode("&?", str_split($findstring)); // Johnny likes to go to school&but he only likes to go on Saturday&because Saturdays are the // best days&unless you of course include Mondays&which are also pretty great days // too.&Sometimes Johnny likes picking Strawberrys&with his mother in the fields&but sometimes // he likes picking blueberries $finalstring = preg_replace("/$regexstring/", $replacestring, $mystring); // Break string back up into array, and return any html entities which might have existed // at the beginning. $replacedarray = array_map('html_entity_decode', explode("&", $finalstring)); var_dump($replacedarray);