PHP Regex:没有包装的物品

时间:2014-01-14 20:05:13

标签: php regex

如何通过PHP正则表达式查找和替换字符串中所有未包装的项目?

例如,我有源字符串“2a {2} b2ac1 {1} a {2} aab12 {1} b2a {1} 2”并尝试查找符号“2”,这些字符串未被“{”覆盖“}”,在此之后将其替换为“{3}”:

$input_lines = "2a{2}b2ac1{1}a{2}aab12{1}b2a{1}2";
$regex = "/[^\{](2)[^\}]/";
$input_lines = preg_replace("/[^\{](2)[^\}]/", "{3}", $input_lines);
echo $input_lines;
// 2a{2}{3}c1{1}a{2}aab{3}1}{3}{1{3}

你怎么看,它现在起作用了:(

2 个答案:

答案 0 :(得分:5)

你可以试试这个:

$input_lines = preg_replace('/(?<!{)2(?!})/', '{3}', $input_lines);

答案 1 :(得分:2)

/(?<!{)2(?!})/会做到这一点。已更新,以处理123}等方案。

$input_lines = '2a{2}b2ac1{1}a{2}aab12{1}b2a{1}2';
$input_lines = preg_replace('/(?<!{)2(?!})/', '{3}', $input_lines);

var_dump($input_lines);
// string(42) "{3}a{2}b{3}ac1{1}a{2}aab1{3}{1}b{3}a{1}{3}"

<强>解释

/                                 # Beginning delimiter
 (?<!{)                           # Lookbehind for anything other than {
  2                               # Match 2
 (?!})                            # Lookahead for anything other than }
/                                 # Ending delimiter