输入:
Animal {cow.<span>moo</span>} <span>noises</span>
输出:
Animal {cow.moo} <span>noises</span>
我怎样才能匹配大括号内的<span>
进行替换?
我已经使用
(?<=\{)(.*?)(?=\})
非常感谢任何帮助。
答案 0 :(得分:3)
您可以使用preg_replace_callback
将{...}
之间的字符串与'~{[^}]+}~'
等基本正则表达相匹配,然后在回调函数中替换您需要的内容:
$s = 'Animal {cow.<span>moo</span>} <span>noises</span>';
echo preg_replace_callback('~{[^}]+}~', function($m) {
return str_replace(["<span>", "</span>"], "", $m[0]);
}, $s);
// => Animal {cow.moo} <span>noises</span>
请参阅PHP demo。
如果需要使用正则表达式替换,可以在回调函数中使用preg_replace
。
答案 1 :(得分:0)
如果您要捕获moo
内的span
进行替换,可以使用此正则表达式:
\{.*?\<span\>(.*)\<\/span\>\}
以下是一个示例:https://regex101.com/r/ryP3Y6/1
如果您要删除<span>
标签,可以使用:
(.*\{.*?)(?:\<[\/]?span\>)(.*)(?:<\/span\>)(\}.*)
并使用\1\2\3
代替:
答案 2 :(得分:0)
基于\G
的模式:
$str = preg_replace('~(?:\G(?!\A)|{)[^}]*?\K</?span>~', '', $str);
这种模式从两个可能的分支开始:
(?=[^}]*})
以确保有一个结束括号。\G
开头,即最后一场比赛后的位置。 [^}]*?
禁止超出大括号括号子串。
此设计确保从{开始的所有系列匹配都是连续的,并且找到的<span>
标记位于大括号之间。
对于小字符串,如果您确定大括号是平衡的而不是嵌套的,您还可以使用更简单的模式:
$str = preg_replace('~</?span>(?=[^{}]*})~', '', $str);