如何删除<em>
代码中的html元素</em>
或[ref]...[/ref]
而不更改任何其他内容?
我有:
$string = '[ref]T. Nichols, <em>S. Santana</em>, <em>Clearing waves</em>, <em>(2000.):</em> Lones[/ref]';
$string2 = '[ref]Name, <em>something something</em>, name[/ref]';
我想:
$string = '[ref]T. Nichols, S. Santana, Clearing waves, (2000.): Lones[/ref]';
$string2 = '[ref]Name, something something, name[/ref]';
我的尝试:
$pattern = '/(\[ref\].*)*(?:\<em\>)*(?:\<\/em\>)*(.*\[\/ref\])/';
$replacement = '($1)($2)';
preg_replace($pattern, $replacement, $string);
斜体可以有多次(或没有)。
该模式似乎适用于在文本中选择短代码及其内容,问题是它不会在结束后[/ref]
结束,就像您在此示例中看到的那样http://regexr.com/3ds7p
可以清除<em>
内的所有</em>
和[ref][/ref]
,但不能在外部清除。
答案 0 :(得分:1)
您不应该使用Regex来解析HTML - 它太复杂而不可靠。
尝试使用DOMDocument(如果可用),或者以其他方式安装。
但是在你给出的例子中,你会得到一个简单的方法
str_replace(array('<em>', '</em>'), '', $original);
因为它只是一个oneliner。
如果实际数据如此简单,请尝试..
否则,请执行以下操作,您可以在html页面的正文内容上使用此代码。
$domd = new DOMDocument();
libxml_use_internal_errors(true);//no errors
$domd->loadHTML('<?xml encoding="UTF-8">' . $html); //This is required and very odd IMO. HTML5 is not xml. Oh well..
foreach ($domd->childNodes as $item)
{
if ($item->nodeType == XML_PI_NODE) //Remove garbage..
{
$domd->removeChild($item);
break;
}
}
$domd->encoding = 'UTF-8'; // reset original encoding
$items = $domd->getElementsByTagName("em");
foreach($items as $emElement)
{/*@var $emElement DOMElement*/
/*@var $parent DOMElement*/
$parent = $emElement->parentNode;
if(preg_match('*\[ref\](.+)\[/ref\]*', $parent->textContent, $matches))
{
//var_dump($matches);
//test for <em.+
$parent->textContent = $new_content_maybe_use_preg_replace_callback....; //http://php.net/manual/en/function.preg-replace-callback.php
}
}
libxml_use_internal_errors(false);
$output = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace( array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domd->saveHTML()));