我正在尝试为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"]
会保持不变。
我正在使用否定前瞻。第一部分将始终匹配,(?!类型)变得无关紧要。我不知道如何放置它以便它可以工作。有什么想法吗?
答案 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 ));
答案 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
}
);