有效地替换图案,但不是在蒙版时

时间:2012-12-20 14:18:56

标签: php regex

某种类型的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替代。

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

感谢您的任何建议!

0 个答案:

没有答案