king.oslo Posted January 6, 2010 Share Posted January 6, 2010 how can I replace everything apart from a sub-pattern? For example, how do I strip everything everything apart from Q or B that are enclosed by ?'s ? This example strip everything, but I want to strip everything apart from B or Q <?php $string = 'LotsOfLetters?B?LotsOfLetters'; $regex = '~\w+\?(B|Q)\?\w+~'; $replace = ''; ?> Thanks, Marius Link to comment https://forums.phpfreaks.com/topic/187413-how-can-i-replace-everything-apart-from/ Share on other sites More sharing options...
JAY6390 Posted January 6, 2010 Share Posted January 6, 2010 Why not just use preg_match_all and get them that way? $string = 'LotsOfL?Q?etters?B?LotsOfLe?Q??B?tters'; $regex = '%\?(B|Q)\?%'; preg_match_all($regex, $string, $out); $string = implode('', $out[0]); echo $string; Link to comment https://forums.phpfreaks.com/topic/187413-how-can-i-replace-everything-apart-from/#findComment-989688 Share on other sites More sharing options...
king.oslo Posted January 6, 2010 Author Share Posted January 6, 2010 How can I do this with preg_replace the way I tried to start? Thanks, Marius Link to comment https://forums.phpfreaks.com/topic/187413-how-can-i-replace-everything-apart-from/#findComment-989695 Share on other sites More sharing options...
nrg_alpha Posted January 6, 2010 Share Posted January 6, 2010 Hmm.. if I understand correctly, one way could be to use preg_replace_callback in conjunction with create_function, which is basically an anonymous lamda style function: $string = 'LotsOfL?Q?etters?B?LotsOfLe?Q??B?tters'; echo $string = preg_replace_callback('#(.*?)(?:\?[bQ]\?)?#', create_function('$a', 'return str_replace($a[1], "", $a[0]);'), $string); // Output: ?Q??B??Q??B? So to visualize the process, it goes something like this: Pattern = #(.*?)(?:\?[bQ]\?)?# (red denotes a captured group) LotsOfL?Q? = $a[0] - 1st iteration of the match/capture LotsOfL = $a[1] $a[1] gets replaced by empty quotes within $a[0], which leaves ?Q? to be returned. Repeat and rinse.. etters?B? = $a[0] - 2nd iteration of the match/capture etters = $a[1] $a[1] gets replaced by empty quotes within $a[0], which leaves ?B? to be returned. Etc.. Hopefully that helps. Cheers Link to comment https://forums.phpfreaks.com/topic/187413-how-can-i-replace-everything-apart-from/#findComment-989907 Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.