正则表达式匹配并替换多个字符串

时间:2012-09-24 11:20:57

标签: php regex

我有这个:

$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而不是数组,它正在工作。

1 个答案:

答案 0 :(得分: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中的括号。那就是将这些部分组合在一起。另请注意$n中的$replace。第一个括号组([-{]\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;