某种类型的Wiki格式化使用户可以轻松避免使用HTML:例如**bold** oder //italic//
。我正在寻找的是用HTML代码替换这种格式代码的有效方法,同时保留被''掩盖的东西。例如:
Replace **this** but do ''not touch **this**''
通过多个步骤执行此操作非常简单:
preg_match('/(''|**)(.*?)\\1/', ...
if ($match[0] === "''") {
// Do not touch, further replacements will follow
} else {
// Replace by HTML
}
PHP preg_replace()函数可以非常有效地替换多个模式,因为当使用数组进行模式/替换时,我只会调用一次并避免调用开销。例如:
preg_replace(
array(
'/\\*\\*(.*?)\\*\\*',
'/__(.*?)__/',
'/\\/\\/(.*?)\\/\\/'
),
array(
'<strong>\\1</strong>',
'<u>\\1</u>',
'<i>\\1</i>'
),
$s
)
顺便说一句:这个函数每次会调用大约100到1000次,创建一个动态页面 - 因此我需要一些效率。
所以我的问题是:有没有办法在正则表达式+替换中编码掩码,我可以使用preg_replace(),就像后面的例子一样?当然,嵌套格式应该仍然可行。
我在这里找到了一种删除内容(Condition inside regex pattern)的方法,但我无法将此问题应用于我的问题,因为替换自然会留下不需要的空标记对:
preg_replace(
array(
'/(\'\'(.*?)\'\')|(__(.*?)__)/',
'/(\'\'(.*?)\'\')|(\\*\\*(.*?)\\*\\*)/',
'/\'\'(.*?)\'\'/'
),
array(
'\\1<u>\\4</u>',
'\\1<strong>\\4</strong>',
'\\1'
),
$s
);
// Leaves a void <u></u> and <strong></strong> for each masked section
注意:除了最后一个替换之外,''必须经过每个替换,否则会提前解除部分。因此\ 1替代。
当然我终于可以删除所有的空白标签,但这对我来说似乎相当愚蠢。我很确定,我只是看不到明显的......
感谢您的任何建议!