使用正则表达式删除HTML标记

时间:2010-05-05 17:52:50

标签: php regex

我需要转换

$text = 'We had <i>fun</i>. Look at <a href="http://example.com">this photo</a> of Joe';

[编辑]文字中可能有多个链接。

$text = 'We had fun. Look at this photo (http://example.com) of Joe';

要删除所有HTML标记,并且需要像上面一样添加<a>标记的href值。

使用正则表达式解决这个问题的有效方法是什么?任何代码片段都会很棒。

5 个答案:

答案 0 :(得分:5)

首先执行preg_replace以保留链接。你可以使用:

preg_replace('<a href="(.*?)">(.*?)</a>', '$\2 ($\1)', $str);

然后使用strip_tags来完成其余的标记。

答案 1 :(得分:1)

尝试使用xml解析器将任何标记替换为内部html和带有href属性的a标记。

http://www.php.net/manual/en/book.domxml.php

答案 2 :(得分:1)

DOM解决方案:

$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXPath($dom);
foreach($xpath->query('//a[@href]') as $node) {
    $textNode = new DOMText(sprintf('%s (%s)',
        $node->nodeValue, $node->getAttribute('href')));
    $node->parentNode->replaceChild($textNode, $node);
}
echo strip_tags($dom->saveHTML());

和没有XPath的相同:

$dom = new DOMDocument;
$dom->loadHTML($html);
foreach($dom->getElementsByTagName('a') as $node) {
    if($node->hasAttribute('href')) {
        $textNode = new DOMText(sprintf('%s (%s)',
            $node->nodeValue, $node->getAttribute('href')));
        $node->parentNode->replaceChild($textNode, $node);
    }
}
echo strip_tags($dom->saveHTML());

它只是将任何HTML加载到DomDocument实例中。在第一种情况下,它使用XPath表达式,有点像SQL for XML,并获得具有href属性的所有链接。然后,它从innerHTML和href属性创建一个文本节点元素,并替换该链接。第二个版本只使用DOM API而不使用Xpath。

是的,它比Regex多几行,但这很干净且易于理解,当您需要添加额外的逻辑时,它不会给您带来任何麻烦。

答案 3 :(得分:0)

我使用子串和替换的变体完成了这样的事情。 我今天可能会使用正则表达式,但你想要一个替代方案:

对于<i>标记,我会执行以下操作:

$text = replace($text, "<i>", "");
$text = replace($text, "</i>", "");

(我的php真的很生疏,所以replace可能不是正确的功能名称 - 但这个想法就是我所分享的。)

<a>标签有点棘手。但这是可以完成的。您需要找到<a开始且>结束的点。然后提取整个长度并替换结束</a>

这可能会像那样

$start = strrpos( $text, "<a" );
$end = strrpos( $text, "</a>", $start );
$text = substr( $text,  $start, $end );
$text = replace($text, "</a>", "");

(我不知道这是否会起作用,这个想法也是我想要传达的。我希望代码片段有所帮助,但它们可能无法“开箱即用”。还有很多代码段中可能存在的错误,具体取决于您的具体实施和环境)

参考:

答案 4 :(得分:0)

使用解析器也很容易:

# available from http://simplehtmldom.sourceforge.net
include('simple_html_dom.php');

# parse and echo
$html = str_get_html('We had <i>fun</i>. Look at <a href="http://example.com">this photo</a> of Joe');

$a = $html->find('a');
$a[0]->outertext = "{$a[0]->innertext} ( {$a[0]->href} )";

echo strip_tags($html);

这会在您的测试用例中生成您想要的代码。