Selectively replacing words outside of tags using regular expressions in PHP?
I have a paragraph of text and i want to replace some words using PHP (preg_replace). Here's a sample piece of text:
This lesson addresses rhyming [one]words and ways[/one] that students may learn to identify these words. Topics include learning that rhyming words sound alike and these sounds all come from the [two]ending of the words[/two]. This can be accomplished by having students repeat sets of rhyming words so that they can say them and hear them. The students will also participate in a variety of rhyming word activities. In order to demonstrate mastery the students will listen to [three]sets of words[/three] and tell the teacher if the words rhyme or not.
If you notice there are many occurances of the word 'words'. I want to replace all the occurances that don't occur inside any of the tags with the word 'birds'. So it looks like this:
This lesson addresses rhyming [one]words and ways[/one] that students may learn to identify these birds. Topics include learning that rhyming birds sound alike and these sounds all come from the [two]ending of the words[/two]. This can be accomplished by having students repeat sets of rhyming birds so that they can say them and hear them. The students will also participate in a variety of rhyming word activities. In order to demonstrate mastery the students will listen to [three]sets of words[/three] and开发者_运维技巧 tell the teacher if the birds rhyme or not.
Would you use regular expressions to accomplish this?
Can a regular expression accomplish this?The tags you have don't define a regular language and thus regular expressions won't work well for this. The best I think you can do is remove all the tags (replace them with something else), replace "words" with "birds" and then put the content back.
$str = preg_replace_callback('!\[one\].*?\[/one\]!s', 'hash_one', $input);
$str = str_replace('words', 'birds', $str);
$output = preg_replace_callback('!:=%\w+%=:!', 'replace_one', $str);
$hash = array();
function hash_one($matches) {
global $hash;
$key = ':=%' . md5($matches[0]) . '%=:'; // to ensure this doesn't occur naturally
$hash[$key] = $matches[0];
return $key;
}
function replace_one($amtches) {
global $hash;
$ret = $hash[$matches[0]];
return $ret ? $ret : $matches[0];
}
精彩评论