Auto Paragraph Function with URL Parsing and Smilie Detection

Ciprian on Saturday, August 29, 2020 in Blog

NEW! Learn JavaScript by example. Code snippets, how-to's and tutorials. Try now!

This function emulates WordPress wpautop() function for custom PHP scripts, parses URL addresses and adds smilies/emoticons. If you’re coding your own CMS or string parsing library, it could be useful.

Note: Smilies not included 😢

  • First of all, the function changes 2 line breaks (HTML <br>) into a paragraph.
  • Second, the function changes the remaining single line breaks into HTML <br>, making a SHIFT+ENTER new line.
  • Third, the function parses text URLs and adds hyperlinks and detects preset smilies/emoticons from a function array.
<?php
function smilieMe($text) {
	$smiliesFind = [
		'/:\)/',
		'/:P/',
		'/:D/',
		'/:S/',
		'/:\(/',
		'/:8/',
		'/:tea/',
		'/:o/',
		'/:O/',
		'/:q/',
		'/:Q/',
		'/:hug/',
		'/:joy/',
		'/:yes/',
		'/:no/'
	];
	$smiliesReplace = [
		'<img src="images/smilies/smile.png" alt=":)" title=":)" loading="lazy"',
		'<img src="images/smilies/tongue.png" alt=":P" title=":P" loading="lazy"',
		'<img src="images/smilies/grin.png" alt=":D" title=":D" loading="lazy"',
		'<img src="images/smilies/confused.png" alt=":S" title=":S" loading="lazy"',
		'<img src="images/smilies/sad.png" alt=":(" title=":(" loading="lazy"',
		'<img src="images/smilies/proud.png" alt=":8" title=":8" loading="lazy"',
		'<img src="images/smilies/tea.gif" alt=":tea" title=":tea" loading="lazy"',
		'<img src="images/smilies/wow.png" alt=":o" title=":o" loading="lazy"',
		'<img src="images/smilies/wow.png" alt=":O" title=":O" loading="lazy"',
		'<img src="images/smilies/yay.png" alt=":q" title=":q" loading="lazy"',
		'<img src="images/smilies/yay.png" alt=":Q" title=":Q" loading="lazy"',
		'<img src="images/smilies/hug.gif" alt=":hug" title=":hug" loading="lazy"',
		'<img src="images/smilies/joy.gif" alt=":joy" title=":joy" loading="lazy"',
		'<img src="images/smilies/yes.gif" alt=":yes" title=":yes" loading="lazy"',
		'<img src="images/smilies/no.gif" alt=":no" title=":no" loading="lazy"'
	];

    return preg_replace($smiliesFind, $smiliesReplace, $text);
}

function autopMe($content) {
	$content = trim($content);
	$content = stripslashes($content);

	/*
	 * temporarily replace two or more consecutive newlines
	 * into SOH characters (Start of Heading - first character of a message header)
	 */
	$content = preg_replace('~(\r\n|\n){2,}|$~', "\001", $content);

	// convert remaining single newlines into HTML <br>
	$content = nl2br($content);

	// replace SOH characters with paragraphs
	$content = preg_replace('/(.*?)\001/s', "<p>$1</p>\n", $content);

	$content = smilieMe($content);

	// parse URL addresses (ftp, http, https)
	$content = preg_replace('*(f|ht)tps?://[A-Za-z0-9\./?=\+&%]+*', '<a href="$0">$0</a>', $content);

	return $content;
}

As a bonus, the smilies are lazy loaded.

Related posts

Leave a Reply

Your email address will not be published. Required fields are marked *