11.9. Converting ASCII to HTML
Problem
You want to turn plaintext into reasonably formatted HTML.
Solution
First, encode entities with
htmlentities( )
; then, transform the text into
various HTML structures. The pc_ascii2html( )
function shown in Example 11-3 has basic
transformations for links and paragraph breaks.
Example 11-3. pc_ascii2html( )
function pc_ascii2html($s) {
$s = htmlentities($s);
$grafs = split("\n\n",$s);
for ($i = 0, $j = count($grafs); $i < $j; $i++) {
// Link to what seem to be http or ftp URLs
$grafs[$i] = preg_replace('/((ht|f)tp:\/\/[^\s&]+)/',
'<a href="$1">$1</a>',$grafs[$i]);
// Link to email addresses
$grafs[$i] = preg_replace('/[^@\s]+@([-a-z0-9]+\.)+[a-z]{2,}/i',
'<a href="mailto:$1">$1</a>',$grafs[$i]);
// Begin with a new paragraph
$grafs[$i] = '<p>'.$grafs[$i].'</p>';
}
return join("\n\n",$grafs);
}Discussion
The more you know about what the ASCII text looks like, the better your HTML conversion can be. For example, if emphasis is indicated with *asterisks* or /slashes/ around words, you can add rules that take care of that, as follows:
$grafs[$i] = preg_replace('/(\A|\s)\*([^*]+)\*(\s|\z)/',
'$1<b>$2</b>$3',$grafs[$i]);
$grafs[$i] = preg_replace('{(\A|\s)/([^/]+)/(\s|\z)}',
'$1<i>$2</i>$3',$grafs[$i]);See Also
Documentation on preg_replace( ) at
http://www.php.net/preg-replace.
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access