2012-09-24 170 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;