strpos没有正确搜索字符串

时间:2014-10-09 19:36:58

标签: php

我正在尝试创建一个简单的脚本来获取页面的内容,当新服务器的Order按钮进入时,它会向指定的地址发送一封电子邮件。目前,由于我遇到了麻烦,我只是回应结果。

这是我目前的代码:

<?php
$site = file_get_contents('http://www.soyoustart.com/en/offers/sys-ip-2.xml');

$needle = '<class="order-button"';

if (strpos($site, $needle) !== FALSE)
{
  echo 'Found';
}
else
{
  echo 'Not Found';
}

目前我收到了“未找到”#39;即使该字符串存在于文件的内容中。我做错了什么?

2 个答案:

答案 0 :(得分:4)

您认为该网页包含<class="order"。但它并没有; 包含的内容是

<div class="zone-dedicated-availability button" 
     data-actions="orderButton"
     data-ref="142sys5"
     data-cgi="order"></div>

您可能需要比strpos更强大的工具(不,not regexps)。

如果确实确定页面/ CSS的结构不会改变太多,您可以尝试提取所有&#34;&#34;标签(可通过简单合理的正则表达式识别:&#34;] +&gt;&#34;),然后检查所有标签,直到找到包含&#34; orderButton&#34;或类似的东西。 preg_match_all()array_filter()可能是你的朋友。

另一个非常有希望的可能性是使用XML库 - URL扩展似乎表明它可以访问该页面后面的合理结构化和格式良好的实体树。如果是这样,XPath就是你的朋友。

更新

您指明的XML格式不是很好(它包含非HTML标记headerfooternav;并且它将意大利标记错误地声明为Flagz / fi而不是Flagz / it,与Finland旗帜相撞。哪个文件未经过验证,因此无法信任可靠地工作),所以

simplexml_load_file($address)
      ->xpath('/div[class="button"][data-actions="orderButton"]');

或类似的东西(例如DOMdocument / DOMXpath),虽然正确的方法,但仍然无法正常工作。需要一个更宽松的XML库;你可以尝试SimpleDOM

DOM方法通常要好得多,因为它非常灵活,不需要笨拙的修复&#39;管理改变订单的属性等事项。此外,有几个工具与DOM协作 - 例如,使用Firefox的Firebug扩展,您可以简单地从对象中获取XPath。他们改变了他们的页面布局,而不是猜测如何提取你需要的数据,你可以打开页面,复制并粘贴新的XPath,鲍勃是你的叔叔。

否则,上述蛮力解决方案:

$xml = file_get_contents($url);

// Extract all DIVs with a `class` attribute (maybe `data-actions` would be better?)
preg_match_all('#<div[^>]+class[^>]+>#', $xml, $gregs);

// Accept only those with the appropriate data action
$btns = array_values(
    array_filter(
        $gregs[0],
        function($div) {
            return preg_match('#data-actions="orderButton"#', $div);
        }
    )
);

print_r($btns);

将返回(当然,除非$btns为空)

Array
(
    [0] => <div class="zone-dedicated-availability button" data-actions="orderButton" data-ref="142sys5" data-cgi="order">
)

然后您可以解析它(也使用XML - 只需添加&{39; </div>&#39;)即可访问data-ref等属性:

if (count($btns) != 1) {
    die("No button, or too many buttons");
}

$xml = simplexml_load_string($btns[0] . '</div>');
$attrs = array();
foreach ($xml->attributes() as $key => $value) {
    $attrs[$key] = (string)$value;
}

$ref = $attrs['data-ref'];

print $ref;

这将为$ref分配值&#39; 142sys5&#39;。如果需要,您可以var_dump $attrs数组并查看其他属性。

答案 1 :(得分:1)

避免麻烦,看看DOMDOcumentDOMXPath。不仅strpos HTML / XML不可靠,你还是不应该在没有解析器的情况下解析/读取HTML / XML。

所以,考虑到相同的情况/结果:

<?php
  $site = file_get_content("http://example.com/");

  $dom = new DOMDocument(); // Spin up a new parser
  $dom->loadHtml($site);    // Load your document in

  $domx = new DOMXpath($dom); // XPath (for finding the button easier)
  $query = '//a[@class="order-button"]'; // find all <a class="order-button">
  $orderButtons = $domx->query(query);

  // check for results
  if ($orderButtons.length > 0){
    // found it (or at least 1). Grab it
    $orderButton = $orderButtons->item(0);
  } else {
    // not found
  }

BTW,有人应该联系该网站并告诉他们.HTml扩展名与HTMl内容是愚蠢的。 ; P