我有这个:
$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
而不是数组,它正在工作。
答案 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_callback
。 preg_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;