Q:

How to (only) remove the surrounding HTML tag(s) from an expression in PHP?

In my content management system, I'm using expressions as *|UPCOMING_EVENTS|* allow users to generate dynamic content wherever they please. The users modify / create content via CKEditor. Now, the problem is that CKEditor automatically wraps my expressions with a div or a p or both... 
I would like to modify this
<h1>Title</h1>
<p>Blablabla</p>
<p>*|UPCOMING_EVENTS|*</p> 
<p>Blablabla</p>

into this
<h1>Title</h1>
<p>Blablabla</p>
*|UPCOMING_EVENTS|* 
<p>Blablabla</p>

Could anyone please help me find the way to remove only the surrounding tags (in case nested) of my expressions? Right now I'm using this technique to find and replace my expressions:
preg_match_all('/\*\|(.*?)\|\*/', $content, $matches);
foreach($matches[1] as $mid => $match) {
    $content = str_replace($matches[0][$mid],$match(),$content);    
}

Thanks in advance.

A:

Try
preg_replace('#<([a-z0-9]+)>(\*\|.+?\|\*)</\1>#i', '$2', $subject);

edit:
Maybe a bit too elaborate and only matches one tag. If p and div are both used, this regex is better:
#(<p.*>|<div.*>)+\s*(\*\|.+?\|\*)\s*(</p>|</div>)+#i

