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

时间:2014-08-08 09:55:14

标签: php regex

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

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

现在,如果第1组或第2组存在(并不重要),我想添加一个“?”在字符串的末尾。是否可以在单个正则表达式中进行?

编辑:示例

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

BUT

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

我想知道我是否可以通过SINGLE正则表达式实现这一目标。

2 个答案:

答案 0 :(得分:0)

我用以下方法解决了这个问题:

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

答案 1 :(得分:0)

你有另一种只有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)。