1

某种形式的 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),但我不能将其应用于我的问题,因为替换自然会留下不需要的 void 标签对:

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 替换。

当然,我终于可以去掉所有的空标签,但这对我来说似乎很愚蠢。而且我很确定,我只是看不到明显的...

感谢您的任何建议!

4

0 回答 0