$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.';
有人可以告诉我这是怎么做到的吗?
答案 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。