如何使用正则表达式在PHP中剥离标签?

时间:2010-09-01 13:32:25

标签: php regex strip-tags

$string = 'text <span style="color:#f09;">text</span>
<span class="data" data-url="http://www.google.com">google.com</span>
text <span class="data" data-url="http://www.yahoo.com">yahoo.com</span> text.';

我想要做的是从数据类的所有范围中获取 data-url 。所以,它应该输出:

$string = 'text <span style="color:#f09;">text</span>
http://www.google.com text http://www.yahoo.com text.';

然后我想删除所有剩余的 html标记

$string = strip_tags($string);

输出:

$string = 'text text http://www.google.com text http://www.yahoo.com text.';

有人可以告诉我这是怎么做到的吗?

4 个答案:

答案 0 :(得分:4)

如果您的字符串不仅包含您显示的HTML代码段,则应使用DOM <{3}}

//span/@data-url

示例:

$dom = new DOMDocument;
$dom->loadHTML($string);
$xp = new DOMXPath($dom);
foreach( $xp->query('//span/@data-url') as $node ) {
    echo $node->nodeValue, PHP_EOL;
}

上面会输出

http://www.google.com
http://www.yahoo.com

如果您已加载HTML,也可以

echo $dom->documentElement->textContent;
在这种情况下,

返回与strip_tags($string)相同的结果:

text text
google.com
text yahoo.com text.

答案 1 :(得分:1)

尝试使用SimpleXML并按元素使用 - 然后检查class属性是否有效并抓住data-url

答案 2 :(得分:0)

preg_match_all("/data/" data-url=/"([^']*)/i", $string , $urls);

您可以通过这种方式获取所有URl a =。

你也可以使用simplexml作为 hsz 提到的

答案 3 :(得分:0)

简短的回答是:不要。在这周围有一个可爱的咆哮,解释了为什么用正则表达式解析html是一个坏主意。从本质上讲,它归结为'html不是常规语言,因此正则表达式不足以解析它'。你需要的是DOM意识到的东西。

正如@hsz所说,如果您知道您的html验证为XML,那么SimpleXML是一个不错的选择。更好的可能是DOMDocument::loadHTML,它不需要格式良好的HTML。一旦你的html在DOMDocument对象中,你就可以很容易地提取你的内容。查看文档here