2012-09-24 131 views
4

我有这样的:正则表达式匹配和替换多个字符串

$only_left_pattern = '/[^-{]\bleft\b/'; 
$subject = 'body {left: 24px;}\n p {right:30px;}'; 
$subject = preg_replace($only_left_pattern, 'right', $subject); 
echo $subject; 

我需要声明,因为我要匹配每个字符串的模式。 如果有办法,我可以匹配的权利或左侧,并根据该更换? 示例(语法从我的头):

$right_left_pattern = '/[^-{](\bleft\b|\bright\b/)'; 

// if you found left replace with right, if you found right replace with left 
// acrording to the order in the pattern 
$subject = preg_replace($only_left_pattern, right|left, $subject); 

就是我要问,如果我可以这样做我用PHP或者只是用正则表达式的例子。

我想Dave的解决方案

$pattern = array('/[^-{]\bleft\b/','/[^-{]\bright\b/'); 
$replace = array('right','left'); 
$subject = 'body {left: 24px;} p {right: 24px;}'; 
$subject = preg_replace($pattern, $replace, $subject); 
echo $subject; 

,但它不工作,我测试了regex没有阵列,它的工作。

+3

['preg_replace_callback()']( http://php.net/preg-replace-callback),尽管你也可以将数组传递给'preg_replace()'的第一个和第二个参数 - 但是我怀疑回调是你想要的。 – DaveRandom

+1

你现在在问什么? – Petah

+0

thanks DaveRandom, tryed this did not work: $ pattern = array('/ [^ - {] \ bleft \ b /','/ [^ - {] \ bright \ b /'); $ replace = array('right','left'); $ subject ='body {left:24px;} p {right:24px;}'; $ subject = preg_replace($ pattern,$ replace,$ subject); –

回答

1

第一个问题是你的正则表达式。您有[^-{],这意味着您正在检查的字符串不是以-{开头,但由于{left:{开头,所以匹配忽略了它。我想象你所说的只是取代left这个词。替换字符串中的一部分,你需要使用反向引用这样的:

$pattern = '/([-{]\b)(left)(\b)/'; 
$replace = '$1right$3'; 
$subject = 'body {left: 24px;} p {right: 24px;}'; 
$subject = preg_replace($pattern, $replace, $subject); 

// result: body {right: 24px;} p {right: 24px;} 
echo $subject; 

请注意,在$pattern括号。这是将这些部分组合在一起。另请注意$replace中的$n。第一个括号组([-{]\b)$1,第二个(left)$2,并且第三个(\b)$3

现在,解决了更换左 - >右,但所建议的,因为这会发生,你不能做数组:

body {left: 24px;} p {right: 24px;} 

Step 1: replace left pattern 
body {right: 24px;} p {right: 24px;} 

Step 2: replace right pattern 
body {left: 24px;} p {left: 24px;} 

糟糕!现在你已经全部离开了。这不是很有帮助。你真正想要的是preg_replace_callbackpreg_replace_callback将为每个匹配运行用户定义的函数。所以我们要做的是,我们发现所有的左派和权利一气呵成,然后在我们的函数,我们交换左/右,并返回它加上原来的字符串,像这样:

function replaceLeftRight($matches) { 
    // get the opposite left/right 
    $leftRight = ($matches[2] == 'left') ? 'right' : 'left'; 
    return $matches[1] . $leftRight . $matches[3]; 
} 

$pattern = '/([-{]\b)(left|right)(\b)/'; 
$subject = 'body {left: 24px;} p {right: 24px;}';  
$subject = preg_replace_callback($pattern, 'replaceLeftRight', $subject); 

// result: body {right: 24px;} p {left: 24px;} 
echo $subject;