正则表达式替换括号

问题描述:

之间的HTML标签我需要更换放在括号之间的HTML标签。以下是我的代码。任何帮助,将不胜感激。正则表达式替换括号

$string = '<table><tr>Hello{<strong><br/>name<br/></strong>}</tr></table>'; 
echo preg_replace("/\{<.*?>\}/","",$string); 

需要的输出是

<table><tr>Hello name</tr></table> 
+0

嗯,这是行不通的。你有'{空格

+0

空间不是必需的 – DevOps

+0

当然不是,这就是为什么你的正则表达式不匹配任何东西。你实际上是在说“找一个'{'后面跟着一个'

你不能做到这一点只用一个简单的正则表达式,但你可以使用正则表达式查找paranthesis块作为follwing

function process_paranthesis($match) { 
    return strip_tags($match[1]); 
} 

$string = '<table><tr>Hello { <strong>name</strong>}</tr></table>'; 
echo preg_replace_callback("/\{([^\}]*)\}/", "process_paranthesis",$string); 

正则表达式被修改为找到所有{...} - 块,并且我们使用preg_replace_callback(),它调用计算匹配将被替换的字符串的函数。回调函数的参数$ match以各种方式包含有关匹配的信息。 $ match [0]包含匹配的全部文本,$ match [1]包含匹配内第一个palenthesis中的文本。 然后在回调函数中使用函数strip_tags()删除所有HTML标签。这是一个预定义的功能,应该用来代替重新发明*。

正则表达式被构造如下:

  1. A匹配与{开始和以}结束;我们需要逃避它,所以我们使用\{ ... \}
  2. 我们要处理的一切,但周边{},所以我们把圆paranthesis内:\{( ... )\},然后将得到的花括号内$整个内容匹配[1]没有进一步需要删除那些花括号使用其他字符串函数。
  3. 我们希望允许{和除}本身}之间的所有字符;我们使用[^\}],它匹配每种字符,但是};并且我们希望允许它们中的多个,导致:[^\}]*

注意:.*是贪婪的。所以,如果我们只是使用.*而不是[^\}]*,那么在有多个花括号的块的情况下,我们会得到奇怪的结果。本场比赛将开始在字符串中的第一开口{和结束在最后},并会包含所有和它之间的一切。这会匹配如下:“文本{in first} something between {and second one}。还有一些。” - 但我们希望它能像这样匹配:“文字{in first}之间的东西{and second one}。还有更多。”,对吧?

+0

这工作...真的很感谢。 – DevOps

+0

@Stefan K.说得好。 – Manish

@Diksha试试这个:

$string = '<table><tr><td>Hello {<strong><br/>name<br/></strong>}</td></tr></table>'; 


echo $str = preg_replace_callback("/\{<.*?>\}/", function($m){ 
    return preg_replace('/\{|\}/',"",strip_tags($m[0])); 
}, $string); 
+0

It作品.. thnks – DevOps

+0

在这里,马尼什也很好的工作。只是更快一点,并解释了一些东西。继续吧! (upvote) – SDwarfs