0
$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的跨度中获取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

4 回答 4

4

如果您的字符串包含的不仅仅是您显示的 HTML 片段,您应该使用带有此XPath的DOM

//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.
于 2010-09-01T13:53:11.940 回答
1

尝试SimpleXML按元素使用和 foreach - 然后检查class属性是否有效并data-url获取

于 2010-09-01T13:36:36.413 回答
0
preg_match_all("/data/" data-url=/"([^']*)/i", $string , $urls);

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

您还可以使用提到的hsz的 simplexml

于 2010-09-01T13:41:09.050 回答
0

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

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

于 2010-09-01T14:01:20.907 回答