PHP中有条件preg_replace吗?

Dis*_*oat 5 php regex preg-replace

我有一些像这样的代码,它用一个链接取代了一些短代码:

$search = array(
    '#\{r\|([^|]+)\|([^}]+)\}#',
    '#\{t\|([^|]+)\|([^}]+)\}#',
    ...,
);

$replace = array(
    '<a href="/ref/$1">$2</a>',
    '<a href="/type/$1">$2</a>',
    ...,
);

$content = preg_replace( $search, $replace, $content );
Run Code Online (Sandbox Code Playgroud)

我有更多相似的东西,所以我想知道,是否有某种方法可以preg_replace通过条件将其简化为一个简单的?

例如,使用正则表达式#\{([a-z])\|([^|]+)\|([^}]+)\}#并根据其字母将第一个匹配替换为不同的东西(r = ref,t = type)?(如果有帮助,那么短代码就像{r|url-slug|LinkTitle}.)

mar*_*rio 10

这需要preg_replace_callback(或者可能只是/eeval修饰符),这将允许您将映射t= typer= ref放在替换逻辑中:

= preg_replace_callback('#\{([rt])\|([^|]+)\|([^}]+)\}#', "cb_123", ...

function cb_123($m) {

    $map = array("t" => "type",  "r" => "ref");
    $what = $map[  $m[1]  ];

    return "<a href=\"/$what/$m[2]\">$m[3]</a>";
}
Run Code Online (Sandbox Code Playgroud)