使用正则表达式删除短代码中的<em>

时间:2016-07-23 00:34:09

标签: php regex

如何删除<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],但不能在外部清除。

1 个答案:

答案 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()));