【问题标题】:insert string on simple html dom output在简单的 html dom 输出上插入字符串
【发布时间】:2015-11-06 00:05:08
【问题描述】:

我需要在 dom 元素中插入一个字符串,以便它们在调用 simple_html_dom::__tostring 时显示,但它们不会影响 simple_html_dom api。

所以,如果我有一个 simple_html_dom 节点,其中$node->outertext 如下:

<div class="MyClass">
    <div itemprop="myVar">

    </div>
</div>

然后,我想将 $string='INSERTED STRING' 分配给显示屏上的自动插入。输出如下:

<div class="MyClass">
    INSERTED STRING
    <div itemprop="myVar">

    </div>
</div>

所以想法是,当使用 simple_html_dom api 与元素交互时,就好像没有插入 $string。然后在输出html时,在开始(或结束)标签之后(或之前)插入$string

例如,$node-&gt;innertext = $string.$node-&gt;innertext 是不可接受的,因为它会影响解析,因为 $node 会在开始时有一个新的孩子。

有没有内置的方法可以做到这一点?
如果没有,有没有办法在不编辑simple_html_dom 的源代码的情况下完成它?

编辑:性能不是问题,因为输出将被缓存。
并且:我刚刚意识到我可以只执行$node-&gt;setAttribute('insertOnDisplay',$string) 然后抓取文档在显示之前再次删除属性,并将属性值放入内部文本。在将其作为答案发布之前,我会看看是否有其他更好的选择(并进行测试)。

【问题讨论】:

  • 我很困惑为什么不能在打印出 html 之前插入文本?
  • 如果它只是用于输出目的,那么如果您希望原始节点不受影响,则只需创建另一个变量
  • 我正在抓取一个文档,当满足某些条件时(比如一个节点具有某个标签或属性),然后我将元素传递给其他函数以对其进行操作,比如添加一个 @987654332 @ 属性或... 这些函数中的任何一个都可以附加 simple_html_dom 不应该看到的文本(输出时除外)。因此,我认为您的任何一种方法都会增加严重的复杂性......
  • 虽然,我现在意识到,我可以做$node-&gt;setAttribute('insertOnDisplay',$string),然后在显示之前再次抓取文档,删除属性,并将属性值放入内部文本。

标签: php simple-html-dom


【解决方案1】:

我扩展了 simple_html_dom 和 simple_html_dom_node 并在 simple_html_dom_node 中创建了一个 prepareOutput 方法,该方法通过并找到具有 jdom-[before|after]:[outertext|innertext] 的任何属性,然后将文本设置在 innertextoutertext 之前或之后.这感觉像是一种 hacky 方式,但它确实有效。

我还稍微更改了simple_html_dom 以使用new static::$domClass 实例化一个dom 和new static::$nodeClass 实例化一个节点而不是使用new static,这样我就可以在创建新节点时让它实例化我的子类内部

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 2020-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多