Php抓取-如何在源代码中捕获变量?
在下面的html代码中,我想捕获变量“1.31”。已经谢谢你的帮助了Php抓取-如何在源代码中捕获变量?,php,web,screen-scraping,Php,Web,Screen Scraping,在下面的html代码中,我想捕获变量“1.31”。已经谢谢你的帮助了 Source Code <div style="font-size:20px">1.31 <i class="fa fa-try"></i> <span style="text-decoration: line-through; color:#919191; font-size: 14px; margin-top: 7px; margin-right: 5px; float:l
Source Code
<div style="font-size:20px">1.31 <i class="fa fa-try"></i> <span style="text-decoration: line-through; color:#919191; font-size: 14px; margin-top: 7px; margin-right: 5px; float:left" itemprop="price" content="1.55">1.55 <i class="fa fa-try" itemprop="priceCurrency" content="TL"></i></span>
<link itemprop="availability" href="http://schema.org/InStock">
</div>
<?php
$url = "https://www.oyunfor.com/knight-online/gb-gold-bar";
$url_connect = file_get_contents($url);
preg_match('@<div style="font-size:20px">(.*?)<i@si',$url_connect,$results);
print_r($results);
?>
源代码
1.31 1.55
您的代码运行得非常好,但是我建议您进行一次小的修改:
<?php
$markup = <<<HTML
<div style="font-size:20px">1.31 <i class="fa fa-try"></i> <span style="text-decoration: line-through; color:#919191; font-size: 14px; margin-top: 7px; margin-right: 5px; float:left" itemprop="price" conten
<link itemprop="availability" href="http://schema.org/InStock">
</div>
HTML;
preg_match('@<div style="font-size:20px">(.*?)<i@si', $markup, $results);
var_dump($results[1]);
更新:
正如您在下面的注释中所指出的,如果您没有使用示例中所示的静态标记进行演示,而是实现了一个内部http请求,从某个远程服务器获取该标记(如您在问题中所示),则不会得到预期的结果
原因是,您以这种方式收到的标记与您在问题中给出的示例不匹配。它略有不同,这会导致正则表达式不匹配。这就是为什么正则表达式被认为是解析此类标记的一种糟糕方法的主要原因:当主题标记发生一些小的更改时,正则表达式就很容易崩溃
更具体地说:您接收回的标记实际上是无效的。您可能没有意识到这一点,因为您在浏览器中可视化了它。但请注意,浏览器试图“修复”一些东西以使其可用。对于调试,您需要查看没有此类中间层的情况,以了解实际处理的内容。在这里,您应该将收到的标记转储到某个日志文件中
无论如何:您可以稍微修改正则表达式,使其再次匹配。这就是我所建议的,使用它会再次产生如上所示的相同输出
@<div\s+[^>]*style="?font-size:20px"?[^>]*>(.*?)<i@si
@]*style=“?font size:20px”?[^>]*>(.*)有什么问题?因此,使用DOM解析器读取html标记,然后选择您喜欢的任何内容。正则表达式不太适合解析html…除此之外:您的代码工作得非常好$results[1]
保存字符串1.31
@Martin,我无法用我正在使用的代码捕获此变量。确实,它是在$results[1]
中捕获的,它是一个数组,正好将该字符串作为单个元素保存。它之所以是数组,是因为使用了preg\u match\u all()
而不是preg\u match()
。我在下面的回答中指出了这一点。非常感谢!当我使用file_get_contents时,会给出结果“Array()”。那么,我如何在不使用标记的情况下运行呢?@CanKorkmaz听起来像是您再次使用了preg_match_all()
而不是preg_match()
…不,我不:)然后检查$result
以及从内部请求接收的作为标记的有效负载中到底包含了什么。请将这些信息作为“更新”添加到问题本身。谢谢
@<div\s+[^>]*style="?font-size:20px"?[^>]*>(.*?)<i@si