preg_replace在省略时插入默认值

时间:2013-05-31 15:02:05

标签: php regex preg-replace

我正在尝试为preg_replace工作一些正则表达式,当它不在主题中时会插入默认键=“value”。

这就是我所拥有的:

$pattern = '/\[section([^\]]+)(?!type)\]/i';
$replacement = '[section$1 type="wrapper"]';

我想要转变:

[section title="This is the title"]

成:

[section title="This is the title" type="wrapper"]

但是当有值时,我不希望它匹配。这意味着:

[section title="This is the title" type="full"]

会保持不变。

我正在使用否定前瞻。第一部分将始终匹配,(?!类型)变得无关紧要。我不知道如何放置它以便它可以工作。有什么想法吗?

4 个答案:

答案 0 :(得分:2)

应该是

/\[(?![^\]]*type)section([^\]]*)\]/i
   -------------         ------
         |                  |->your required data in group 1
         |->match further only if there is no type!

试试here

答案 1 :(得分:2)

$your_variable = str_replace('type="full" type="wrapper"]','type="full"]',preg_replace ( '/\[section([^\]]+)(?!type)\]/i' , '[section$1 type="wrapper"]' , $your_variable ));

在此处查看http://3v4l.org/6NB51

答案 2 :(得分:2)

您可以使用:

$pattern = '~\[section\b(?:[^t\]]++|t(?!ype="))*+\K]~';
$replacement = ' type="wrapper"]';

echo preg_replace($pattern, $replacement, $subject);

答案 3 :(得分:1)

我认为你这是错误的做法。就个人而言,我会使用preg_replace_callback来处理它。类似的东西:

$out = preg_replace_all(
  "(\\[section((\\s+\\w+=([\"'])(?:\\\\.|[^\\\\])*?\\3)*)\\s*\\])",
  function($m) use ($regex_attribute) {
    $attrs = array(
      "type"=>"wrapper",
      // you may define more defaults here
    );
    preg_match_all("(\\s+(\\w+)=([\"'])((?:\\\\.|[^\\\\])*?)\\2)",$m,$ma,PREG_SET_ORDER);
    foreach($ma as $a) {
      $attrs[$a[1]] = $a[3];
    }
    return // something - you can build your desired output tag using the attrs array
  }
);