4

件名にない場合にデフォルトの key="value" を挿入する preg_replace の正規表現に取り組もうとしています。

ここに私が持っているものがあります:

$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

これを使用できます:

$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 に答える