php:解析html:从正文中提取脚本标记并在之前插入</车身>;?

php:解析html:从正文中提取脚本标记并在之前插入</车身>;?,php,dom,html-content-extraction,Php,Dom,Html Content Extraction,我不关心库是什么,但我需要一种从页面的中提取元素的方法(作为字符串)。然后我想在前面插入提取的s 理想情况下,我想将s提取为两种类型 1) 外部(具有src属性的) 2) 嵌入式(代码介于之间的) 到目前为止,我已经尝试使用phpDOM、简单HTML DOM和Ganon。 我对它们中的任何一个都没有运气(我可以找到链接并删除/打印它们——但每次脚本都会失败!) (很抱歉重新发布,但经过24小时的尝试和失败,使用替代LIB,失败更多等等) 根据@alreadycoded.com上可爱的正则表达

我不关心库是什么,但我需要一种从页面的中提取元素的方法(作为字符串)。然后我想在前面插入提取的s

理想情况下,我想将s提取为两种类型
1) 外部(具有src属性的) 2) 嵌入式(代码介于之间的)

到目前为止,我已经尝试使用phpDOM、简单HTML DOM和Ganon。
我对它们中的任何一个都没有运气(我可以找到链接并删除/打印它们——但每次脚本都会失败!)


(很抱歉重新发布,但经过24小时的尝试和失败,使用替代LIB,失败更多等等)


根据@alreadycoded.com上可爱的正则表达式回答,我成功地将以下内容组合在一起:

$output = "<html><head></head><body><!-- Your stuff --></body></html>"
$content = '';
$js = '';

// 1) Grab <body>
preg_match_all('#(<body[^>]*>.*?<\/body>)#ims', $output, $body);
$content = implode('',$body[0]);

// 2) Find <script>s in <body>
preg_match_all('#<script(.*?)<\/script>#is', $content, $matches);
foreach ($matches[0] as $value) {
    $js .= '<!-- Moved from [body] --> '.$value;
}

// 3) Remove <script>s from <body>
$content2 = preg_replace('#<script(.*?)<\/script>#is', '<!-- Moved to [/body] -->', $content); 

// 4) Add <script>s to bottom of <body>
$content2 = preg_replace('#<body(.*?)</body>#is', '<body$1'.$js.'</body>', $content2);

// 5) Replace <body> with new <body>
$output = str_replace($content, $content2, $output);
$output=“”
$content='';
$js='';
//1)抓取
preg#u match_all('#(]*>.*)#ims',$output,$body);
$content=内爆(“”,$body[0]);
//2)在
preg_match_all(“#”.$value;
}

//3)删除以选择具有src属性的所有脚本节点

$xpathWithSrc = '//script[@src]';

要选择包含内容的所有脚本节点,请执行以下操作:

$xpathWithBody = '//script[string-length(text()) > 1]';
基本用法(用实际的xpath查询替换查询):


选择具有src属性的所有脚本节点

$xpathWithSrc = '//script[@src]';

要选择包含内容的所有脚本节点,请执行以下操作:

$xpathWithBody = '//script[string-length(text()) > 1]';
基本用法(用实际的xpath查询替换查询):

$js=”“;
$content=file\u get\u contents(“http://website.com");
preg_match_all(“#
$js=”“;
$content=file\u get\u contents(“http://website.com");

preg_match_all('#如果你真的想找一个简单的库,我可以推荐:


在PHP中真的没有更简单的方法来做这样的事情。

如果您真的在寻找一个简单的库,我可以推荐:



在PHP中真的没有更简单的方法来做这样的事情。

“…这个问题可能已经有了答案:…“不,没有!因此我发布了这个问题的原因!(也许如果你更关注回答而不是监管,事情会更好??)如果你要投否决票,至少让石头留下一条解释原因的评论。相关:这不是重复的//这是一篇关于“任何”php库/方法的文章,其中作为“其他”POST是关于当时使用的一个特定的图书馆。/ /不幸的是,随着标题的改变……叹息:因为它已经在一天之内,我尝试了各种片段。然后我选择考虑不同的……这个问题可能已经有了答案:…不,不!所以我发布了这个!(也许如果你更关注回答而不是监管,事情会更好???)如果你要否决投票,至少要留下一条解释原因的评论。相关:这不是重复的//这是一篇关于“任何”php库/方法的帖子,其中作为“其他”POST是关于当时使用的一个特定的库。/ /不幸的是,标题被改变了……叹息:因为它已经在一天左右,我尝试了各种片段。然后我选择了考虑>差异和库是什么?(我要假设“XPath”???)。它如何处理可能畸形的HTML?(感谢Amal Murali的回答-只是对溢出警察有点恼火,并且在解析上浪费了24小时,这与脚本标记无关。这只是phps默认的dom表示。它应该出现在几乎所有php5安装中(只要在编译时libxml以任何形式出现)。处理格式错误的html是可能的,但这要视情况而定。如果可能的话,你应该避免它。或者事先对你的html进行sanatize。LOL-我甚至不能让它运行而不抛出错误。上面的正则表达式(我知道,“yuk”)实际上在哪里工作?库在哪里?(我假设为“XPath”?)。它如何处理可能格式错误的html?(感谢Amal Murali的回答-只是对溢出警察有点恼火,并且在解析上浪费了24小时,这与脚本标记无关。这只是phps默认的dom表示。它应该出现在几乎所有php5安装中(只要在编译时libxml以任何形式出现)。处理格式错误的html是可能的,但这要视情况而定。如果可能的话,你应该避免它。或者事先对你的html进行sanatize。LOL-我甚至无法让它运行而不抛出错误。作为正则表达式(我知道,“yuk”)上面的内容确实有效!看起来它将从整个文档中获取JS,而不仅仅是包含在?中的内容。我接受了答案,因为这是唯一“完整”的规定,也是我唯一能够工作的内容。我添加了“工作”版本(仅包括)到我问题的底部//谢谢!它很混乱,而且它用正则表达式解析html(我们都知道这是一个禁忌)@pguardiario-是的,它很凌乱…但它很有效!!!这比我尝试使用DOM库时所能说的还要多,更不用说不涉及包含和附加代码等。你不喜欢它吗?然后给我看一个包含的库,并做与代码相同的工作!看起来它会从整个文档中获取JS,ra除了包含在中的那些内容之外?我接受了这个答案,因为这是唯一“完整”的规定,也是我唯一能够工作的东西。我在问题的底部添加了“工作”版本(仅包括)//谢谢!它很凌乱,而且它用正则表达式解析html(我们都知道这是不允许的)@pguardiario-是的,它很凌乱…但它很有效!!!这超出了我对DOM库的尝试所能说的,更不用说不涉及包含和附加代码等。你不喜欢它吗?然后向我展示一个包含的库,并做与该代码相同的工作!
$dom = str_get_html($html);
$scripts = $dom->find('script')->remove;
$dom->find('body', 0)->after($scripts);
echo $dom;