Swift-R Posted February 14, 2010 Share Posted February 14, 2010 Can someone explain what is wrong with this code? $string = "blabla <'bl'a'> hello"; $result = preg_replace( "#<'([^'>]\S+)'>#", "'" . $this->escape_string( "$1" ) . "'", $string ); What this is supposed to do is to pick the text inside <' and '> and do a mysql_real_escape_string ($this->escape_string) to that text. It is displaying the $string correctly, without the < and > but escape_string isn't working. It's supposed to return blabla 'bl\'a' hello instead of blabla 'bl'a' hello. I have also tried to use the function strtoupper instead of $this->escape_string but it is still not working. Any ideas? Quote Link to comment https://forums.phpfreaks.com/topic/192045-preg_replace-help/ Share on other sites More sharing options...
salathe Posted February 14, 2010 Share Posted February 14, 2010 You can't call preg_replace like that (and have it do what you're expecting). The replacement string will effectively be '$1' which of course just wraps the matched value in single quotes. Instead, you should use a callback function with preg_replace_callback like: // The match gets fed into this function which returns the replacement string public function escape_and_quote_match($match) { return "'" . $this->escape_string($match[1]) . "'"; } // How to call preg_replace_callback $result = preg_replace("#<'([^'>]\S+)'>#", array($this, 'escape_and_quote_match'), $string); Quote Link to comment https://forums.phpfreaks.com/topic/192045-preg_replace-help/#findComment-1012165 Share on other sites More sharing options...
Swift-R Posted February 14, 2010 Author Share Posted February 14, 2010 You can't call preg_replace like that (and have it do what you're expecting). The replacement string will effectively be '$1' which of course just wraps the matched value in single quotes. Instead, you should use a callback function with preg_replace_callback like: // The match gets fed into this function which returns the replacement string public function escape_and_quote_match($match) { return "'" . $this->escape_string($match[1]) . "'"; } // How to call preg_replace_callback $result = preg_replace("#<'([^'>]\S+)'>#", array($this, 'escape_and_quote_match'), $string); Thank you! $result = preg_replace_callback( "#<'([^'>]\S+)'>#", create_function( '$matches', 'return strtoupper($matches[1]);' ), $string); But if I use $this->escape_string($matches[1]); it returns this error: Using $this when not in object context in ... : runtime-created function on line 1 Guess I'll have to use your example. Quote Link to comment https://forums.phpfreaks.com/topic/192045-preg_replace-help/#findComment-1012187 Share on other sites More sharing options...
salathe Posted February 14, 2010 Share Posted February 14, 2010 That's correct, anonymous functions (those created using create_function) do not belong to a class/object so $this is meaningless in that case. Quote Link to comment https://forums.phpfreaks.com/topic/192045-preg_replace-help/#findComment-1012197 Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.