4

我正在尝试为 preg_replace 处理一些正则表达式,当它不在主题中时,它将插入默认的 key="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"]

会保持不变。

我错误地使用了负前瞻。第一部分将始终匹配并且 (?!type) 变得无关紧要。我不确定如何放置它以使其正常工作。有任何想法吗?

4

4 回答 4

2

它应该是

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

在这里试试

于 2013-05-31T15:08:50.740 回答
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

于 2013-05-31T15:10:05.407 回答
2

你可以使用这个:

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

echo preg_replace($pattern, $replacement, $subject);
于 2013-05-31T15:13:39.263 回答
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
  }
);
于 2013-05-31T15:13:19.307 回答