Formatting with Custom Markup Tags
用户自己的标记作格式化
你可以提供特殊的标记给用户使用,例如,你可以允许使用...加重显示,...斜体显示,这样做简单的查找替换操作就可以了: $output = str_replace("[b]", "<b", $output);
$output = str_replace("[i]", "<i", $output);
再作的好一点,我们可以允许用户键入一些链接。例如,用户将允许输入[link="url"]...[/link],我们将转换为<a href=""...</a语句
这时,我们不能使用一个简单的查找替换,应该使用正则表达式进行替换:
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="\1"', $output);
ereg_replace()的执行就是:
查找出现[link="..."]的字符串,使用<a href="..." 替换它
[[:graph:]]的含义是任何非空字符,有关正则表达式请看相关的文章。
在outputlib.php的format_output()函数提供这些标记的转换,总体上的原则是:
调用htmlspecialchars()将HTML标记转换成特殊编码,将不该显示的HTML标记过滤掉,
然后,将一系列我们自定义的标记转换相应的HTML标记。
请参看下面的源代码:
<?php
function format_output($output) {
/****************************************************************************
* Takes a raw string ($output) and formats it for output using a special
* stripped down markup that is similar to HTML
****************************************************************************/
$output = htmlspecialchars(stripslashes($output));
/* new paragraph */
$output = str_replace('[p]', '<p', $output);
/* bold */
$output = str_replace('', '<b', $output);
$output = str_replace('', '</b', $output);
/* italics */
$output = str_replace('', '<i', $output);
$output = str_replace('', '</i', $output);
/* preformatted */
$output = str_replace('[pre]', '<pre', $output);
$output = str_replace('[/pre]', '</pre', $output);
/* indented blocks (blockquote) */
$output = str_replace('[indent]', '<blockquote', $output);
$output = str_replace('[/indent]', '</blockquote', $output);
/* anchors */
$output = ereg_replace('[anchor="([[:graph:]]+)"]', '<a name="\1"</a', $output);
/* links, note we try to prevent javascript in links */
$output = str_replace('[link="javascript', '[link=" javascript', $output);
$output = ereg_replace('[link="([[:graph:]]+)"]', '<a href="\1"', $output);
$output = str_replace('[/link]', '</a', $output);
return nl2br($output);
}
?
一些注意的地方:
记住替换自定义标记生成HTML标记字符串是在调用htmlspecialchars()函数之后,而不是在这个调用之前,否则你的艰苦的工作在调用htmlspec 猜你喜欢