此行会在我的Web主机上崩溃页面,但不会在我的localhost上崩溃

时间:2018-03-01 18:32:57

标签: php wordpress xpath syntax domdocument

$title = $xpath->query("span[@class='item_list']",$item)[0];

我无法弄清楚为什么只有当我在网络主机上省略此行时它才有效。 localhost似乎正常且功能正常。这用于Wordpress 4.9.4中的模板。我不知道主机的PHP版本是什么。此行位于另一个xpath查询的循环内,如果上面的那行被删除,它将与页面一起使用:

foreach( $xpath->query("//div[@class='product_list']") as $item) {    }

我的网络主机上的php有限制设置阻止我做多个查询吗?或者是嵌套查询?

2 个答案:

答案 0 :(得分:1)

在较旧的PHP版本中,节点列表不能被视为数组(&lt.5.6.3)。

以下是避免此问题的几种方法。

使用->item()方法

$titleNode = $xpath->query("span[@class='item_list']",$item)->item(0);

在Xpath中使用限制

foreach ($xpath->query("span[@class='item_list'][1]",$item) as $titleNode) {
  //...
}

这将节点列表中的节点限制为第一个节点。如果Xpath表达式与节点不匹配,则foreach()可以为第一个节点执行一次。验证这是否是要处理的标题节点是一个很好的快捷方式。

直接获取文本内容

$titleString = $xpath->evaluate("string(span[@class='item_list'])",$item);

Xpath表达式可以返回标量变量(字符串,数字,布尔值)的结果。这仅适用于DOMxpath::evaluate()string()将第一个匹配的节点强制转换为字符串(返回其文本内容)。如果没有匹配的节点,它返回一个空字符串。

答案 1 :(得分:0)

This answer解决了我的问题。当我打开脚本上的错误报告并向我展示时,罪魁祸首出现了:

#include <boost/fusion/adapted/struct.hpp>
struct Command {
    std::string one, two, three;
};

BOOST_FUSION_ADAPT_STRUCT(Command, one, two, three)

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi = boost::spirit::qi;

template <typename It> 
struct CommandParser : qi::grammar<It, Command()> {
    CommandParser() : CommandParser::base_type(start) {
        using namespace qi;

        command = field(Ref(&f1)) ^ field(Ref(&f2)) ^ field(Ref(&f3));
        field   = '-' >> raw[lazy(*_r1)];

        f1 += "foo";
        f2 += "handle", "bar", "mustache";
        f3 += "meow", "mix", "want";

        start   = skip(blank) [ command >> eoi ] >> eps(is_valid(_val));
    }
  private:
    // mandatory field check
    struct is_valid_f {
        bool operator()(Command const& cmd) const { return cmd.one.size(); }
    };
    boost::phoenix::function<is_valid_f> is_valid;

    // rules and skippers
    using Options = qi::symbols<char>;
    using Ref     = Options const*;
    using Skipper = qi::blank_type;

    qi::rule<It, Command()> start;
    qi::rule<It, Command(), Skipper> command;
    qi::rule<It, std::string(Ref)> field;

    // option values
    Options f1, f2, f3;
};

boost::optional<Command> parse(std::string const& input) {
    using It = std::string::const_iterator;

    Command cmd;
    bool ok = parse(input.begin(), input.end(), CommandParser<It>{}, cmd);

    return boost::make_optional(ok, cmd);
}

#include <iomanip>
void run_test(std::string const& input, bool expect_valid) {
    auto result = parse(input);

    std::cout << (expect_valid == !!result?"PASS":"FAIL") << "\t" << std::quoted(input) << "\n";
    if (result) {
        using boost::fusion::operator<<;
        std::cout << " --> Parsed: " << *result << "\n";
    }
}

int main() {
    char const* valid[] = { 
        "-foo",
        "-foo           -bar",
        "-foo-want",
        "-foo -meow-bar",
        "-foo-mix-mustache",
        "-handle      -foo-meow",
        "-mustache-foo",
        "-mustache -mix -foo",
        "-want-foo",
        "-want-meow-foo",
        "-want-foo-meow",
    };
    char const* invalid[] = {
        "woof",
        "-handle-meow",
        "-ha-foondle",
        "meow",
        "-foobar",
        "stackoverflow",
        "- handle -foo -mix",
        "-handle -mix",
        "-foo -handle -bar",
        "-foo -handle -mix -sodium",
    };

    std::cout << " === Positive test cases:\n";
    for (auto test : valid)   run_test(test, true);
    std::cout << " === Negative test cases:\n";
    for (auto test : invalid) run_test(test, false);
}

我引用了错误,并了解到它是由我最初怀疑的本地主机和Web主机之间的不同PHP版本引起的。