【问题标题】:Extract a particular part of a large HTML code block stored in PHP variable提取存储在 PHP 变量中的大型 HTML 代码块的特定部分
【发布时间】:2011-11-09 00:46:21
【问题描述】:

我有一个幻灯片的嵌入代码,如下所示。整个 html 存储在变量 $embed_code 中。

我正在用 PHP 打印这段代码。现在我想要这个 HTML 字符串中的一段代码。

代码写在下面。我只想要<object> 标签之间的代码。

$embed_code = '
 <div style="width:425px" id="__ss_617490"><strong style="display:block;
 margin:12px 0 4px"><a href="http://www.slideshare.net/al.capone/funny-beer-babies-
 enginnering-rev-2-presentation" title="Funny beer babies enginnering rev. 
 2">Funny beer babies enginnering rev. 2</a></strong>


<object id="__sse617490" 
 width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com
/swf/ssplayer2.swf?doc=becoming-an-engineer-1222340701618958-9&stripped_title=funny-  
 beer-babies-enginnering-rev-2-presentation&userName=al.capone" /><param  
 name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/>
 <embed name="__sse617490" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=
  becoming-an-engineer-1222340701618958-9&stripped_title=funny-beer-babies-enginnering-
  rev-2-presentation& userName=al.capone" type="application/x-shockwave-flash" 
   allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed> 
  </object>




 <div style="padding:5px 0  12px">View more<a href="http://www.slideshare.net
  /"> presentations</a> from <a href="http://www.slideshare.net/al.capone">
  al.capone</a>.</div></div>';

现在我只想要来自 &lt;object id="....." to "&lt;/embed&gt; &lt;/object&gt; 的这个字符串,整个 HTML 是动态生成的,所以请给我任何想法。

我该怎么做?是否有任何 PHP 函数可以在任何标签之间提取 html?

【问题讨论】:

  • 您可以使用正则表达式或 dom 解析器
  • @soju:我建议使用 dom 解析器 +1,但无法使用 -99999999 来建议正则表达式。所以... +0 它是。
  • 好吧,在这种特殊情况下,一个简单的正则表达式就足够了
  • HTML 标记和“简单正则表达式”是互斥的术语!

标签: php dom html


【解决方案1】:

使用 DOMDocument 类。

$dom = new DomdDocument ();
$dom -> loadHtml ($embed_code);
$htmlObject = $dom -> getElementById ('__sse617490'); // Returns a DomElement

http://www.php.net/dom

【讨论】:

  • +1;我在回答中提到的 PHPQuery 只是用更好的(在我看来)API 包装了它。
  • 但我说这个 html 是动态生成的,所以 div 的 id 会在每张新幻灯片上发生变化。
  • 在这种情况下,您需要某种方法来一致地识别每张幻灯片的 。如果页面上的 是唯一的对象标签,那么您可以简单地使用 getElementsByTagName()。如果不是,那么您需要修改生成标记的代码,以使其有可能使该对象与页面上的所有其他标记不同,可能是通过添加一个类。
  • @rajzana 你想要$dom-&gt;getElementByTagName('object');。见:php.net/manual/en/domdocument.getelementsbytagname.php
  • @GordonM 他似乎正在抓取 Slideshare,所以我认为他无法更改标记。
【解决方案2】:

我喜欢使用PHPQuery 通过 PHP 从 HTML 中解析和提取数据。它使用 jQuerys 简单的 CSS 样式选择器来遍历代码。

原来是这样:

require('phpQuery/phpQuery.php');
$doc = phpQuery::newDocumentHTML($embed_code);
$div = pq('div#__ss_617490'); // select a DIV with the specified ID
var_dump($div->attr('style')); //To get the style attribute
var_dump($div->html()); // To get the inner html

// now to get the object tag like you desire.
$object_tag = pq('object');

// only get the first object
$object_tag = pq('object:first');

【讨论】:

    【解决方案3】:

    您可以只使用正则表达式来解析和提取它:

    $embed_code = "blah blah <object ...>and other code here</object> blah blah";
    
    $matches = array();
    preg_match('#<object(\s*[^>])?>(.*)</object>#iU', $embed_code, $matches);
    
    // $matches[0] = "<object ...>and other code here</object>"
    // $matches[1] = "and other code here"
    

    【讨论】:

    • 正如@MarcB 8 分钟前所讨论的,正则表达式并不是 HTML 解析问题的最佳或最干净的解决方案。
    • @Treffynnon 这取决于上下文 - 有时在内存中创建一个完整的 DOM 结构只是为了提取其中包含的部分文本是多余的,而正则表达式更有效。
    • 清晰更重要。内存很便宜。浪费时间调试代码代价高昂。
    • 内存在某些情况下可能很重要。那么处理时间呢?有时正则表达式会比 DOM 解析器更快。同样,这一切都归结为上下文和考虑因素,例如对输入的控制级别(用户/系统生成,总是格式正确?)应该考虑在内。因此,为什么我的帖子说“可以”而不是“应该”。
    • 要明确,我没有否决这个答案。一定有人比我感觉更强烈!
    猜你喜欢
    • 1970-01-01
    • 2016-06-05
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多