MyBB Community Forums

Full Version: [F] <) and >) converted to smilies [R] [C-Michael83]
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
If you use
<) or >)
inside a post the wink smilie is shown.

Example:
<) >)
We replace < and > with &lt; and &gt; so when you do that it sees &lt;) and &gt;) and it matches the ";)" part which is causing the problem. I guess we just fix the code to correctly check if there is a preceding html entity before

if(is_array($this->smilies_cache))
		{
			foreach($this->smilies_cache as $find => $replace)
			{
				$find = $this->parse_html($find);
				if(version_compare(PHP_VERSION, "5.1.0", ">="))
				{
					$message = preg_replace("#(?<=[^&;\"])".preg_quote($find,"#")."(?=.\W|\"|\W.|\W$)#si", $replace, $message, $remaining, $replacements);
					$remaining -= $replacements;
					if($remaining <= 0)
					{
						break; // Reached the limit
					}
				}
				else
				{
					$message = preg_replace("#(?<=[^&;\"])".preg_quote($find,"#")."(?=.\W|\"|\W.|\W$)#si", $replace, $message, $remaining);
				}
			}
		}

inc/class_parser.php
I don't see the problem in this to be honest.......unless u want to show a pizza slice, u wont post < ) and it wont make it <)
I could be doing....

(i.e. </html>)
Thank you for your bug report.

This bug has been fixed in our internal code repository. Please note that the problem will not be fixed here until these forums are updated.

With regards,
MyBB Group
Find in inc/class_parser.php

if(version_compare(PHP_VERSION, "5.1.0", ">="))
				{
					$message = preg_replace("#(?<=[^&;\"])".preg_quote($find,"#")."(?=.\W|\"|\W.|\W$)#si", $replace, $message, $remaining, $replacements);
					$remaining -= $replacements;
					if($remaining <= 0)
					{
						break; // Reached the limit
					}
				}
				else
				{
					$message = preg_replace("#(?<=[^&;\"])".preg_quote($find,"#")."(?=.\W|\"|\W.|\W$)#si", $replace, $message, $remaining);
				}

and replace with

$find = preg_quote($find, "#");
				// Fix issues for smileys starting with a ";"
				if($find{0} == ";")
				{
					$find = "(?<!&gt|&lt|&amp)".$find;
				}
				
				if(version_compare(PHP_VERSION, "5.1.0", ">="))
				{
					$message = preg_replace("#(?<=[^\"])".$find."(?=.\W|\"|\W.|\W$)#si", $replace, $message, $remaining, $replacements);
					$remaining -= $replacements;
					if($remaining <= 0)
					{
						break; // Reached the limit
					}
				}
				else
				{
					$message = preg_replace("#(?<=[^\"])".$find."(?=.\W|\"|\W.|\W$)#si", $replace, $message, $remaining);
				}