Regex新手来了。我正在尝试修复论坛软件的一个插件(坏了)。它正在生成以下正则表达式:
/(?:s|^)[(?::)]|;)])(?:s|$)/m
…使用preg_replace()
替换文本块中[:)]
或[];)]
的所有实例。但是,它并没有取代[:)]
或[;)]
的实例。有什么想法吗?
编辑:有问题的插件是表情符号,代表香草。以下是代码(删除了无关部分和电子邮件地址):
>
// 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" /> ;
}