Home >Backend Development >PHP Tutorial >javascript - php如何像js一样解析DOM?
js就是为html而生,比如,我想验证
<code><style> #demo_div{display:none;} </style> <div id="demo_div"></div> </code>
那么用jquery的话,alert($('#demo_div').attr('display'))就行,但是如果我用服务器端的php如何抓取一个网页中DOM元素,然后结合css来分析它的css属性呢?有没有已经写好的函数or类?
js就是为html而生,比如,我想验证
<code><style> #demo_div{display:none;} </style> <div id="demo_div"></div> </code>
那么用jquery的话,alert($('#demo_div').attr('display'))就行,但是如果我用服务器端的php如何抓取一个网页中DOM元素,然后结合css来分析它的css属性呢?有没有已经写好的函数or类?
补充3:
请在给题主的问题点“赞”之前,好好阅读本问题的补充2和评论7楼,想一下是否应该这样做。
楼主的Y问题本身倒还可以,但题主弄出XY Problem的不良实践,理应再得到一次教训。
补充2:
好嘛你个题主!
闹了半天,一短一长两个答案,调动3个会员6层楼评论,问你半天你才说出最终要做什么!!!
干嘛不早把你的本来目的交代清楚?!
典型的XY Problem——刻舟求剑,问非所求,必须要先麻烦社区半天才能找出来你的目的,真是一点意思也没有。题主请先阅读一下这篇文章。
我看了下题主的问题的反响,几乎所有的问题都是负分,我想题主你这个问题又该找踩了。
你还是好好回去反省下吧,多读几遍《提问的智慧》,少给社区留下一些莫名其妙、浪费时间的猜谜游戏。
补充1:
你也许可以考虑用PHP调用一个只支持HTML+CSS(不带js)的渲染核心,然后把渲染结果拿来利用。这样至少就可以:
如果想做斩草除根的实现,就不要想着只在PHP的框架内做得到这个事情。
完全实现你这个需求,单纯依赖任何PHP库,死也做不到。任何。死也不行。没疑问。
因为一个简单的原理:如果只分析网页的HTML字符串文本,我们完全无法判断demo_div最后的某个属性,会处在一个什么状态上。
例如你的例子里,display
属性是用额外的<style></style>
定义的。但我们也可以另外这样去定义:
style
属性定义简单的说:坑人的办法要多少有多少,闭着眼睛想出100来个不成问题。想在PHP的框架中找一个通行的办法,不要想,和永动机一样根本行不通。
解决这个问题的唯一办法,是真的用浏览引擎把这个页面渲染出来,然后才能判断某个DOM元素的某个属性,最终会被改成什么样子。但这样也无法对抗以下类似的问题:
说了这么多,最终的意思就是:js能够解析DOM,说到底依赖于js在执行时已经有了浏览器环境做铺垫,页面已经被渲染出来。这一点是PHP怎么也达不到的。
甚至严重点说,由于js的存在,从HTML中解析出的DOM结构,其实到最后很大程度上也是不准确的。用js让网页的面貌“大翻天”毫无困难。也就是说,PHP实现的DOM解析,其实从某个角度上来说,相对于浏览器的渲染行为总是片面的,需要你科学的看待和使用。
你的这种问题总是需要依赖人类的智能,见招拆招,同时做好对方网站会不断变化的准备。就像那些火车抢票软件的做法那样。比如你的这个,如果你确定对方网页中<style></style>
块总是出现在demo_div
块的上方,那就用DOM库找到紧临demo_div
前面的<style></style>
,然后用正则表达式做字符串分析就行。原网页变化了,你的对策再跟着改。
不过,如果原网页是在开发者能够控制的范围内的,那恐怕就需要检讨数据传递方式,为什么要给开发者自己惹这么大的麻烦了。
你是不是需要 PHPJQuery ?
补充答案:
骚年,用正确的工具做对的事情,Node.js应该是你的最佳解决方案。
用php开启一个浏览器引擎的进程进行渲染,在里面运行jquery,将结果用ajax返回至php里。