匹配子字符串的子字符串

时间:2017-07-20 13:28:32

标签: php regex

输入:

Animal {cow.<span>moo</span>} <span>noises</span>

输出:

Animal {cow.moo} <span>noises</span>

我怎样才能匹配大括号内的<span>进行替换? 我已经使用

匹配大括号之间的所有内容
(?<=\{)(.*?)(?=\})

非常感谢任何帮助。

3 个答案:

答案 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代替:

检查:https://regex101.com/r/qECuai/1

答案 2 :(得分:0)

基于\G的模式:

$str = preg_replace('~(?:\G(?!\A)|{)[^}]*?\K</?span>~', '', $str);

这种模式从两个可能的分支开始:

  • 第二个分支是首先匹配的分支,以{开头{以确保您在大括号内。请注意,您可以在其后面添加(?=[^}]*})以确保有一个结束括号。
  • 第一个分支以\G开头,即最后一场比赛后的位置。

[^}]*?禁止超出大括号括号子串。

此设计确保从{开始的所有系列匹配都是连续的,并且找到的<span>标记位于大括号之间。

对于小字符串,如果您确定大括号是平衡的而不是嵌套的,您还可以使用更简单的模式:

$str = preg_replace('~</?span>(?=[^{}]*})~', '', $str);