正则表达式替换括号
问题描述:
之间的HTML标签我需要更换放在括号之间的HTML标签。以下是我的代码。任何帮助,将不胜感激。正则表达式替换括号
$string = '<table><tr>Hello{<strong><br/>name<br/></strong>}</tr></table>';
echo preg_replace("/\{<.*?>\}/","",$string);
需要的输出是
<table><tr>Hello name</tr></table>
答
你不能做到这一点只用一个简单的正则表达式,但你可以使用正则表达式查找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标签。这是一个预定义的功能,应该用来代替重新发明*。
正则表达式被构造如下:
- A匹配与
{
开始和以}
结束;我们需要逃避它,所以我们使用\{
...\}
。 - 我们要处理的一切,但周边
{
和}
,所以我们把圆paranthesis内:\{(
...)\}
,然后将得到的花括号内$整个内容匹配[1]没有进一步需要删除那些花括号使用其他字符串函数。 - 我们希望允许
{
和除}
本身}
之间的所有字符;我们使用[^\}]
,它匹配每种字符,但是}
;并且我们希望允许它们中的多个,导致:[^\}]*
注意:.*
是贪婪的。所以,如果我们只是使用.*
而不是[^\}]*
,那么在有多个花括号的块的情况下,我们会得到奇怪的结果。本场比赛将开始在字符串中的第一开口{
和结束在最后}
,并会包含所有块和它之间的一切。这会匹配如下:“文本{in first} something between {and second one}
。还有一些。” - 但我们希望它能像这样匹配:“文字{in first}
之间的东西{and second one}
。还有更多。”,对吧?
答
@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);
嗯,这是行不通的。你有'{空格
空间不是必需的 – DevOps
当然不是,这就是为什么你的正则表达式不匹配任何东西。你实际上是在说“找一个'{'后面跟着一个'