带有可选匹配项的preg_replace

时间:2013-02-10 12:36:17

标签: php preg-replace

嗯..我自己创建了一个博客,我为我的“POSTS”创建了一个preg_replace然后输入:

[code="php"]foobar[!code]

他打印

<script type="syntaxhighlighter" class="brush: $1; html-script: true"><![CDATA[ foobar ]]></script>

这个preg_replace:

运行正常
/\[code="(.*?)"\]/

(对于前缀)

/\[!code\]/

(对于sufix)

但是现在我想添加一个额外的选项,但检查用户是否已经打字...想法是这样的:

[code="php" [1,3]]
foo
[!code]

返回:

<script type="syntaxhighlighter" class="brush: $1; highlight: [1,3]; html-script: true">...

否则如果没有$ 2(用户只键入[code =“php”])则返回:

<script type="syntaxhighlighter" class="brush: $1; html-script: true">

如何在同一preg_replace中创建此语句?提前谢谢,并为不良的英语而烦恼。

修改

我已经使用* preg_replace_callback *

实现了我的解决方案

1 个答案:

答案 0 :(得分:1)

您需要使用preg_replace_callback来执行您想要的操作:

function format_prefix($matches)
{
    return '<script type="syntaxhighlighter" class="brush: '
        . $matches[1]
        . (isset($matches[2]) ? '; highlight: ' . $matches[2] : '')
        . '; html-script: true">';
}

$s = '[code="php"]foobar[!code]'."\n".'[code="php" [1,3]]foobar[!code]';

echo preg_replace_callback('/\[code="(.*?)"(?:\s+(\[\d+,\d+\]))?\]/', 'format_prefix', $s);