How to restrict where emoticons are parsed

By default, the Emoticons plugin matches all emoticons regardless of their surroundings.

The properties notAfter and notBefore can be used to control whether emoticons should be matched before or after a certain type of characters, using a PCRE expression. For instance, if you don't want to match an emoticon that immediately follows a non-space character, you would set notAfter to \S. If you don't want to match an emoticon that immediately precedes a letter from A to Z or from a to z, you would set notBefore to [A-Za-z].

In the following example, we configure the Emoticons plugin to only match emoticons that not surrounded by non-space characters. Note that the double negative does not mean that the emoticons must be surrounded by space. They can also be preceded by nothing (at the start of the text) or followed by nothing (at the end of the text.)

$configurator = new s9e\TextFormatter\Configurator;
$configurator->Emoticons->add(':)', '<img src="happy.png" alt=":)" title="Happy">');
$configurator->Emoticons->add(':(', '<img src="sad.png" alt=":(" title="Sad">');

$configurator->Emoticons->notAfter  = '\\S';
$configurator->Emoticons->notBefore = '\\S';

// Get an instance of the parser and the renderer
extract($configurator->finalize());

$text = "Emoticons surrounded with whitespace: :) :(\nSame without whitespace:              :):(";
$xml  = $parser->parse($text);
$html = $renderer->render($xml);

echo $html;
Emoticons surrounded with whitespace: <img src="happy.png" alt=":)" title="Happy"> <img src="sad.png" alt=":(" title="Sad">
Same without whitespace:              :):(