WikiParser 类包含将 Wiki 输入文本转换为等效 HTML 输出的方法。它虽然不是功能非常强大的 Wiki 转换应用程序,但是说明了正则表达式在模式匹配和字符串转换方面的一些很好的用法。
构造函数和
setWikiData()
方法一起,可简单地初始化 Wiki 输入文本范例字符串,如下所示:
public function WikiParser()
{
wikiData = setWikiData();
}
当用户单击范例应用程序中的“Test”按钮时,应用程序将调用 WikiParser 对象的
parseWikiString()
方法。此方法可调用许多其他方法,这些方法再组合输出的 HTML 字符串。
public function parseWikiString(wikiString:String):String
{
var result:String = parseBold(wikiString);
result = parseItalic(result);
result = linesToParagraphs(result);
result = parseBullets(result);
return result;
}
所调用的每个方法(
parseBold()
、
parseItalic()
、
linesToParagraphs()
和
parseBullets()
)都会使用字符串的
replace()
方法替换由正则表达式定义的匹配模式,以便将 Wiki 输入文本转换为 HTML 格式的文本。
转换粗体和斜体模式。
parseBold()
方法会查找 Wiki 粗体文本模式(如
'''foo'''
)并将其转换为等效的 HTML 格式(如
<b>foo</b>
),如下所示:
private function parseBold(input:String):String
{
var pattern:RegExp = /'''(.*?)'''/g;
return input.replace(pattern, "<b>$1</b>");
}
请注意,正则表达式的
(.?*)
部分匹配两个定义
'''
模式之间任意数目的字符 (
*
)。
?
数量表示符使匹配不再是无限制的,因此对于字符串
'''aaa''' bbb '''ccc'''
,第一个匹配的字符串是
'''aaa'''
而不是以
'''
模式开头和结尾的整个字符串。
正则表达式中的括号定义捕获组,
replace()
方法通过在替换字符串中使用
$1
代码引用此组。正则表达式中的
g
(
global
) 标志确保
replace()
方法替换字符串中的所有匹配(不仅仅是第一个)。
parseItalic()
方法的原理与
parseBold()
方法类似,只是前者检查作为斜体文本分隔符的两个省略号 (
''
)(而不是三个):
private function parseItalic(input:String):String
{
var pattern:RegExp = /''(.*?)''/g;
return input.replace(pattern, "<i>$1</i>");
}
转换项目符号模式
如下面的示例所示,
parseBullet()
方法会查找 Wiki 项目符号行模式(如
* foo
)并将其转换为等效的 HTML 格式(如
<li>foo</li>
):
private function parseBullets(input:String):String
{
var pattern:RegExp = /^\*(.*)/gm;
return input.replace(pattern, "<li>$1</li>");
}
正则表达式开头的
^
符号匹配行的开头。正则表达式中的
m
(
multiline
) 标志使正则表达式用
^
符号来匹配行的开头,而不是简单地匹配字符串的开头。
\*
模式匹配星号字符(反斜杠用于表示星号本身,而不是
*
数量表示符)。
正则表达式中的括号定义捕获组,
replace()
方法通过在替换字符串中使用
$1
代码引用此组。正则表达式中的
g
(
global
) 标志确保
replace()
方法替换字符串中的所有匹配(不仅仅是第一个)。
转换段落 Wiki 模式
linesToParagraphs()
方法将每行中输入的 Wiki 字符串转换为 HTML
<p>
段落标签。该方法中的这些行从输入的 Wiki 字符串中去除空行:
var pattern:RegExp = /^$/gm;
var result:String = input.replace(pattern, "");
正则表达式中的
^
和
$
符号分别匹配行的开头和结尾。正则表达式中的
m
(
multiline
) 标志使正则表达式用 ^ 符号来匹配行的开头,而不是简单地匹配字符串的开头。
replace()
方法使用空字符串 (
""
) 替换所有匹配子字符串(空行)。正则表达式中的
g
(
global
) 标志确保
replace()
方法替换字符串中的所有匹配(不仅仅是第一个)。