两个外部分隔符之间的内部分隔符有多清楚

时间:2016-08-27 10:25:15

标签: php regex string

我可以使用什么正则表达式匹配两个或多个定界符内部两个定界符并清除它?一些例子:

1) input:  %word1 %word2%%   then output:  %word1 word2%
2) input:  %word1 %word2% %word3%%% then output: %word1 word2 word3%
3) input:  %%word1 word2% word3% then output: %word1 word2 word3%

等等。 或者应用替换忽略来自两个分隔符的子字符串,例如:

%word1 word2% text word2

将%word替换为%word2%而不将其应用于%word1 word2%,以便将输出内容输出为:

%word1 word2% text %word2%

而不是:

%word1 %word2%% text %word2%

非常感谢。

3 个答案:

答案 0 :(得分:1)

问题的第二部分:

$ cat a.php
<?php
   echo preg_replace('/(?<!%)(word2)(?!%)/', '%word2%', '%word2% %word1 word2% text word2');
?>
$ php a.php
%word2% %word1 word2% text %word2%

正则表达式的工作原理如下:

(?<!%)(word2)(?!%)

Regular expression visualization

Debuggex Demo

答案 1 :(得分:0)

我不知道它是否有用但我有一个简单的解决方案:

$string = "%%word1 word2% word3%";
$output = "%".str_replace("%", "", $string)."%";

如果您的字词包含&#39;%&#39;它将无效。介于两者之间。

答案 2 :(得分:0)

以@Nehal为例,我现在有两部分代码:

// CODE 1
// string return: "word1 word2 word3 word4 word2" <-- failed
$string = "word1 word2 word3 word4 word2";
$array = array("word1 word2", "word2");
foreach ($array as $value) {
    $string = preg_replace('/(?<!%)($value)(?!%)/', '%$value%', $string);
}
echo $string;

// CODE 2
//string2 return: "%word1 word2% word3 word4 %word2%" <-- correct
$string0 = "word1 word2 word3 word4 word2";
$string1 = preg_replace('/(?<!%)(word1 word2)(?!%)/', '%word1 word2%', $string0);
$string2 = preg_replace('/(?<!%)(word2)(?!%)/', '%word2%', $string1);
echo $string2;

CODE1失败但CODE2工作正常!我可以修复CODE1吗?我想哪个问题是为变量传递的正则表达式的值。一些解决方案再次感谢。

<强> 更新: 解决了替换:

$string = preg_replace('/(?<!%)($value)(?!%)/', '%$value%', $string);

使用:

$string = preg_replace('/(?<!%)('.$value.')(?!%)/', '%'.$value.'%', $string);