php修改后网页没反应 php修改后网页没变化
本文旨在解决在使用PHP的DOMDocument和XPath修改DOM时,由于第一次修改导致修改后续出现Call to a member function splitText() on bool错误的问题。通过分析问题原因,提出了一种通过反向处理匹配项来避免修改位置偏移的有效解决方案,并提供了相应的代码示例。
在使用PHP的DOMDocument和DOMXPath处理HTML内容时,需要经常查找并修改特定的文本节点。一个常见的需求几个关键词或用lt;spangt;标签包裹起来,以便进行样式控制或特殊处理。然而,如果在修改循环中DOM结构,可能会遇到一个棘手的问题:第一次修改后,后续的更新和操作修改可能会DOM结构的改变而出现错误。到成员函数 splitText() 上bool。
问题分析
该错误通常发生在尝试对已经之前的DOM操作而剩余的节点执行splitText()方法时。splitText()方法用于将一个文本节点分割成两个节点。当DOM发生结构变化时,剩余的节点对象可能不再有效,或者其在DOM树中的位置已经改变,导致splitText()方法无法正确执行。
立即学习“PHP免费学习笔记(深入)”;
解决方案:逆向处理匹配项
一个有效的解决方案是逆向处理匹配项。这意味着,不要从前往后依次替换找到的匹配项,而是从后往前进行替换。这样,每次修改只会影响当前位置之前的DOM结构,而不会影响后续处理的匹配项的位置和偏移量。
代码示例
下面是修改后的代码示例,展示了如何反向处理匹配项来避免错误:/** * 自动将各种形式的CCJM包装在类中以用于品牌宣传 * * @param string $content * @return string */function ccjm_branding_filter(string $content): string { if (! (is_admin() amp;amp; ! wp_doing_ajax()) amp;amp; $content) { $DOM = new DOMDocument(); /** * 使用内部错误来绕过 HTML5 警告 */ libxml_use_internal_errors(true); /** * 加载内容,使用正确的编码和解析所需的 `lt;htmlgt;` 包装器 */ $DOM-gt;loadHTML(quot;lt;?xml encoding='utf-8' ?gt;lt;htmlgt;{$content}lt;/htmlgt;quot;, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); /** * 清除错误以绕过 HTML5 警告 */ libxml_clear_errors(); /** * 初始化 XPath */ $XPath = new DOMXPath($DOM); /** * 检索所有文本节点,脚本中的节点除外 */ $text = $XPath-gt;query(quot;//text()[not(parent::script)]quot;); foreach ($text as $node) { /** * 查找所有匹配项,包括偏移量 */ preg_match_all(quot;/(C\.? ?C\.?(?:JM| Johnson (?:amp;|amp;|amp;|and) Malhotra)(?: Engineers, LTD\.?|, P\.?C\.?)?)/iquot;, $node-gt;textContent, $matches, PREG_OFFSET_CAPTURE); /** * W
将每个匹配项放在适当的 span 中 */ $group = array_reverse($matches[0]); // 反转匹配项数组 foreach ($group as $key =gt; $match) { /** * 确定匹配项的偏移量和长度 */ $offset = $match[1]; $length = strlen($match[0]); /** * 分离匹配项及其后的内容 */ $word = $node-gt;splitText($offset); $after = $word-gt;splitText($length); /** * 创建包装 span */ $span = $DOM-gt;createElement(quot;spanquot;); $span-gt;setAttribute(quot;classquot;, quot;__brandquot;); /** * 用 span 替换单词,然后在其中重新插入单词 */ $word-gt;parentNode-gt;replaceChild($span, $word); $span-gt;appendChild($word); } } /** * 保存修改,删除不需要的标签 */ $content = implode(array_map([$DOM-gt;documentElement-gt;ownerDocument, quot;saveHTMLquot;], iterator_to_array($DOM-gt;documentElement-gt;childNodes))); } return $content;}登录后复制
关键的修改如下这行代码:$group = array_reverse($matches[0]); //匹配项数据库登录后复制
通过使用array_reverse()函数,我们将匹配项数据库的顺序,从而保证
从后往前处理匹配项。
注意事项编码问题:在加载HTML内容时,必须指定正确的编码,避免出现乱码问题。HTML结构:确定加载的HTML内容具有良好的结构,例如包含lt;htmlgt;和lt;bodygt;标签。性能优化:对于大型HTML文档,间隔的DOM操作可能会影响性能。可以考虑使用更高效的字符串处理方法,或者使用服务器机制来减少DOM操作的次数。
总结
在使用PHP的DOMDocument和DOMXPath修改DOM结构时,需要特意另外注意DOM结构的变化对后续操作的影响。通过逆向处理匹配项,可以有效地避免因DOM结构改变而导致的错误,保证代码的稳定性和可靠性。此外,还需要关注编码问题、HTML结构和性能优化等方面,以提高代码的质量和效率。
以上就是解决PHP DOMDocument修改导致后续错误的问题的详细内容,更多请关注乐哥常识网其他相关文章!