正则表达式替换,如果组存在则添加字符


Regex replace, add a character if group exists

如果组存在,是否可以添加字符?

preg_replace('/('()?'/:[a-zA-Z0-9]+('))?/', ''/([a-zA-Z0-9]+)', 'm/:x(/:s)');

现在,如果组1或组2存在(真的不重要),我想在字符串的末尾添加一个"?"。有可能在单个正则表达式中完成吗?

编辑:示例

/:x变为'/([a-zA-Z0-9]+)

,

(/:x)变为'/([a-zA-Z0-9]+)?(带问号)

我想知道我是否可以用单个regexp实现这一点。

我用:

$regexCallback = function($r) {
    return ''/([a-zA-Z0-9]+)' . (isset($r[1]) ? "?" : "");
};
var_dump(preg_replace_callback('/('()?'/:[a-zA-Z0-9]+('))?/', $regexCallback, $t));

您有另一种方法,只有preg_replace,因为您可以为模式和替换参数提供一个数组:

$patrep =  array ('~'(/:[a-z0-9]+')~i' => ''/([a-zA-Z0-9]+)?',
                  '~/:[a-z0-9]+~i'     => ''/([a-zA-Z0-9]+)');
$result = preg_replace(array_keys($patrep), $patrep, $str); 

通过这种方式,原始字符串被处理两次。然而,它可能比使用preg_replace_callback更快,这取决于原始字符串的样子(大小,出现次数的nb)。