Jocka Posted October 2, 2006 Share Posted October 2, 2006 I was trying to make my own template class but I ran into problems I don't quite understand.I use preg_match to find where loops start and end and read everything between. For some reason, it won't get the HTML when it matches. I can't figure out how to get it to show the HTML too.On preg_replace, I can't get it to replace the loop strings themselves. such as {loop} info {/loop} it changes the 'info' part but the {loop} parts are still there. I don't understand why. I have to use str_replace to get rid of those but that seems ignorant since preg_replace SHOULD be doing it.Any idea on why it's not getting the HTML and why its not replacing the {loop} areas? Link to comment https://forums.phpfreaks.com/topic/22802-preg_match-preg_replace/ Share on other sites More sharing options...
effigy Posted October 2, 2006 Share Posted October 2, 2006 Can you provide a small example? A couple of ideas:[list][*]You may be printing out the match result in the browser; doing so will cause the HTML to be rendered. Use the htmlentities function to see what you really matched.[*]Curly braces are metacharacters in regex--are you escaping them?[/list] Link to comment https://forums.phpfreaks.com/topic/22802-preg_match-preg_replace/#findComment-102719 Share on other sites More sharing options...
Jocka Posted October 2, 2006 Author Share Posted October 2, 2006 My codes on a different computer.. but let me try to remember how I set it..(code probably isn't 100% accurate here)preg_match("\/{$name/}(.*?)/{\/$name/}/s", $this->t_html, $matches);and preg_replace is about the same. I first store $matches in another area $this->loop . I echoed that with htmlentities and nothing. I checked out the source of the page to make sure and it showed no html. So I'm not really sure. My brackets are escaped properly, I know that. Because I'm getting the correct area changes and code (for the most part).when I did preg_match, I want everything saved.. such as: {loop} <b>{text}</b> {/loop}all that with the html in it. then I'd like to replace all that after I'm done. I can get {text} and thats it.. thats all I can change too, which confuses me. Link to comment https://forums.phpfreaks.com/topic/22802-preg_match-preg_replace/#findComment-102724 Share on other sites More sharing options...
effigy Posted October 2, 2006 Share Posted October 2, 2006 [list][*]Curly braces should be escaped with a backslash, not a forward.[*]Anything that you want saved you have surround in capturing parenthesis:[tt] ( )[/tt].[*]You should[tt] preg_quote [/tt]your[tt] $name [/tt]variable in case it contains any metacharacters.[/list] Link to comment https://forums.phpfreaks.com/topic/22802-preg_match-preg_replace/#findComment-102730 Share on other sites More sharing options...
Jocka Posted October 3, 2006 Author Share Posted October 3, 2006 I messed with it a little last night and got most of it working. I still have to use str_replace to get rid of the start and end of the loop tags though. I just added a function in there to kill all tags at the end of the script so I didn't keep doing it over and over and wasting time.I'd still like to figure out whats going on but I know it's hard to help without the code. But it's something like this (just read it):preg_match("/\{$name\}(.*?)\{\/$name\}/is", $this->t_html, $matches);For the most part, it works. I THINK what might be the problem is my loops I save in the array. It saves without the loop tags and then I replace the templates html with what is in the loop array. Maybe it's just reading between the 2 tags and not the 2 tags AND everything between? Link to comment https://forums.phpfreaks.com/topic/22802-preg_match-preg_replace/#findComment-103389 Share on other sites More sharing options...
effigy Posted October 3, 2006 Share Posted October 3, 2006 You can't [i]replace[/i] with a [i]match[/i] function; try a callback:[code]<pre><?php function process ($matches) { return preg_replace('/\[(.+?)\]/', '<\1>', $matches[1]); } $test = 'before {loop}[b]middle[/b]{/loop} after'; $name = 'loop'; echo preg_replace_callback("/\{$name\}(.*?)\{\/$name\}/is", 'process', $test);?></pre>[/code] Link to comment https://forums.phpfreaks.com/topic/22802-preg_match-preg_replace/#findComment-103401 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.