我想创建一个好的语法,以便更容易链接到内部事物,有点像 Wiki,所以也许我认为用户可以使用类似的东西:
Bah bah bah reference: [[a]]
它会将其转换为 HTML:
Bah bah bah reference: <a href="..../id=a">title</a>
但我担心感叹词和安全问题。什么是一个好的语法选择(可能是 [[]] 或其他东西),什么是它的安全正则表达式?
不要重新发明轮子:Text::Markdown。
虽然 Sinan 使用现有语法(如 Markdown)的想法很好,但这种方法的可行性取决于您的具体情况。您没有告诉我们足够多的信息来获得非常有用的回复。您是白手起家,还是继承了大量现有文件,需要进行昂贵的转换过程,更不用说员工再培训了?
如果是后者,有时最好通过考虑短期变通办法和长期策略来解决问题。短期解决方法 - 某种与您的问题中提出的完全一样的本土语法 - 会很丑陋,可能会在这里和那里造成麻烦,但它可以完成工作。例如,我们的组织有一大堆最终为 HTML 页面提供内容的 Word 文档。在这些 Word 文件中,工作人员使用这样的方法来创建链接并做出我们的解析代码处理的一些其他声明:##some_link##
. 失败的方式有很多,但在我们制作的内容类型中,这种情况很少发生。部分出于这个原因,很难对将内容迁移到更强大的系统的长期战略产生很大的热情。我的期望是这样的迁移将会发生,但它是由更大的考虑驱动的,而不是我们笨拙的##foo##
标记设备的限制。
更新:
根据您的其他评论,听起来您将拥有一个链接列表,您希望您的用户能够使用短 ID 快速添加这些链接。因此,这些链接将在某个地方定义,比如 Perl 哈希。您可以使用此哈希来防止无效条目。例如:
use strict;
use warnings;
my %approved_links = (
so_perl => 'http://stackoverflow.com/questions/tagged/perl',
so_ruby => 'http://stackoverflow.com/questions/tagged/ruby',
);
my $regex = qr/ \[\[ ([^\]]+) \]\] /x;
while (<DATA>){
die "Danger: $_\n" if map {
exists $approved_links{$_} ? () : ($_)
} /$regex/g;
s/$regex/$approved_links{$1}/g; # Not complete, but you get the idea.
print;
}
__DATA__
Some text [not an id] [[so_perl]] more [[so_ruby]] more..
[[so_perl]] blah [[so_ruby]] blah
[[bad id!!]]