Can't figure out what's wrong with this regex

sinagamer

New Member
Regex newbie here. There's a (broken) plugin for the forum software I use that I'm attempting to fix. It's generating the following regex:\[code\]/(?:\s|^)\[(?:\:\)\]|;\)\])(?:\s|$)/m\[/code\]... to replace all instances of \[code\][:)]\[/code\] or \[code\][;)]\[/code\] in a block of text using \[code\]preg_replace()\[/code\]. However, it's not replacing the instances of \[code\][:)]\[/code\] or \[code\][;)]\[/code\]. Any ideas?EDIT: The plugin in question is Emoticons, for Vanilla. Here's the code (irrelevant sections and e-mail addresses removed):\[code\]\[code\] // Build an Array containing the Emoticon<-->Graphic matches if (!isset($EmoticonMatch)) { $EmoticonMatch = array( '[:)]' => 'smile.gif', '[;)]' => 'wink.gif', ); // Add more matches, if you need them... Put the corresponding graphics into the Plugin's images-folder } // In case there's something wrong with the Array, exit the Function if (count($EmoticonMatch) == 0) return; // Define the basic Regex pattern to find Emoticons $EmoticonsSearch = '/(?:\s|^)'; // Automatically extend the Regex pattern based on the Emoticon-Codes in the $EmoticonMatch-Array $subchar = ''; foreach ( (array) $EmoticonMatch as $Smiley => $Img ) { $firstchar = substr($Smiley, 0, 1); $rest = substr($Smiley, 1); // new subpattern? if ($firstchar != $subchar) { if ($subchar != '') { $EmoticonsSearch .= ')|(?:\s|^)'; } $subchar = $firstchar; $EmoticonsSearch .= preg_quote($firstchar, '/') . '(?:'; } else { $EmoticonsSearch .= '|'; } $EmoticonsSearch .= preg_quote($rest, '/'); } // Add final Regex pattern to the Search-Variable $EmoticonsSearch .= ')(?:\s|$)/m';}/** * Hack the Discussion-Controller to replace Text with Smilies before output * * @since 1.0 * @version 1.0 * @author Oliver Raduner * * @uses Initialize() * @uses FindEmoticon() */public function DiscussionController_BeforeCommentDisplay_Handler(&$Sender){ // Get the current Discussion and Comments $Discussion = &$Sender->EventArguments['Discussion']; $Comment = &$Sender->EventArguments['Comment']; // Initialize the our Emoticons-Stuff $this->Initialize(); // Replace Emoticons in the Discussion and all Comments to it $Discussion->Body = $this->FindEmoticon($Discussion->Body); $Comment->Body = $this->FindEmoticon($Comment->Body);}/** * Search through a Text and find any occurence of an Emoticon * * @since 1.0 * @version 1.0 * @author Oliver Raduner * * @uses $EmoticonImgTag() * @global array $EmoticonsSearch() * @param string $Text Content to convert Emoticons from. * @return string Converted string with text emoticons replaced by <img>-tag. */public function FindEmoticon($Text){ global $EmoticonsSearch; $Output = ''; $Content = ''; // Check if the Emoticons-Searchstring has been set properly if (!empty($EmoticonsSearch) ) { $TextArr = preg_split("/(<.*>)/U", $Text, -1, PREG_SPLIT_DELIM_CAPTURE); // Capture the Tags as well as in between $Stop = count($TextArr); for ($i = 0; $i < $Stop; $i++) { $Content = $TextArr[$i]; // Check if it's not a HTML-Tag if ((strlen($Content) > 0) && ('<' != $Content{0})) { // Documentation about preg_replace_callback: http://php.net/manual/en/function.preg-replace-callback.php $Content = preg_replace_callback($EmoticonsSearch, array(&$this, 'EmoticonImgTag'), $Content); } $Output .= $Content; } } else { // Return default text. $Output = $Text; } return $Output;}/** * Translate an Emoticon Code into a <img> HTML-tag * * @since 1.0 * @version 1.0 * @author Oliver Raduner * * @global array $EmoticonMatch * @param string $Emoticon The Emoticon Code to convert to image. * @return string HTML-Image-Tag string for the emoticon. */public function EmoticonImgTag($Emoticon){ global $EmoticonMatch; $PluginRoot = Gdn::Config('Garden.WebRoot'). 'plugins' . DS . 'Emoticons' . DS; if (count($Emoticon) == 0) { return ''; } $Emoticon = trim(reset($Emoticon)); $Img = $EmoticonMatch[$Emoticon]; $EmoticonMasked = $Emoticon; return ' <img src="'.$PluginRoot.'images'.DS.$Img.'" alt="'.$EmoticonMasked.'" class="emoticon" /> ';}\[/code\]?>\[/code\]
 
Back
Top