【问题标题】:Search with PHP in XML <B> Data via <C> tag通过 <C> 标签在 XML <B> 数据中使用 PHP 搜索
【发布时间】:2018-04-02 13:50:30
【问题描述】:

首先,我知道已经有一些关于类似事情的问题(Searching an XML file using PHPLoad external xml file?),但我无法制作任何 PHP,所以以下(search.php)是我在 PHP 中复制粘贴的内容:

<html>
<head>
    <title>Search</title>
</head>
<body>
    <?php
    $search = $_POST["search"];
    $xml=simplexml_load_file("inhaltsverzeichniss.xml") or die("Error: Cannot create object");

    $result = $xml->xpath('//array/entry/tags[.="$search"]');

    while(list( , $node) = each($result)) {
        echo '/array/entry/tags: ',$node,"\n";
    }
    ?>
</body>

那么这是我的 HTML 代码(以防有人需要):

<form action="search.php" method="post" >
    <input type="text" name="search" placeholder="search for stuff" >
    <input type="submit" name="search_button" value="Suche" >
</form>

这是我要搜索的 XML 文档 (inhaltsverzichniss.xml):

<?xml version="1.0" encoding="UTF-8"?>
<array>
  <entry>
    <url>Zeitformen Spanisch.odp</url>
    <name>Zeitformen Tabelle</name>
    <tags>spanisch</tags>
  </entry>
  <entry>
    <url>german-stuff.odt</url>
    <name>etwas Deutsches</name>
    <tags>german</tags>
  </entry>
  <entry>
    <url>something_english.html</url>
    <name>english things</name>
    <tags>english</tags>
  </entry>
  <entry>
    <url>other-data.fileextension</url>
    <name>cool name</name>
    <tags>etc.</tags>
  </entry>
</array>

我要做的是搜索写在搜索表单中的标签,并给出整个相应的条目。 (如下:&lt;a href"$url"&gt;$name&lt;/a&gt;&lt;br&gt;Tags: $tags

编辑:这是我当前的带有多个标签的条目的 XML(将其更改为“标签”):

<array>
  <entry>
    <url>spanisch/Zeitformen_Spanisch.ods</url>
    <name>Zeitformen Tabelle</name>
    <tag>spanisch</tag>
  </entry>
  <entry>
    <url>german-stuff.odt</url>
    <name>etwas Deutsches</name>
    <tag>deutsch</tag>
    <tag>spanisch</tag>
    <tag>englisch</tag>
  </entry>
  <entry>
    <url>something_english.html</url>
    <name>english things</name>
    <tag>spanisch</tag>
    <tag>englisch</tag>
  </entry>
  <entry>
    <url>other-data.fileextension</url>
    <name>cool name</name>
    <tag>etc.</tag>
  </entry>
</array>

【问题讨论】:

标签: php html xml search


【解决方案1】:

Quoting the PHP Manual:

注意:与双引号和heredoc语法不同,特殊字符的变量和转义序列在出现在单引号字符串中时不会被扩展。

你在

中使用了单引号
$result = $xml->xpath('//array/entry/tags[.="$search"]');

但单引号会将字符串内容视为文字字符串。它不会像您认为的那样插入$search

将您的代码更改为

$result = $xml->xpath("//array/entry/tags[.='$search']");

它将使用$search而不是文字字符串"$search"

但是,由于您要打印完整的条目元素,因此最好使用此 XPath

$result = $xml->xpath("/array/entry[tags='$search']");

为了可读性,我更喜欢

$result = $xml->xpath(sprintf('/array/entry[tags="%s"]', $search));

这将为您提供所有&lt;entry&gt; 元素,而不是$result 中的&lt;tags&gt; 元素。虽然带有双斜杠的//array 确实有效,但它是不必要的,并且性能比直接路径差一些。这是因为它会尝试查找节点,而不管文档中的位置如何。

然后您可以按照您的要求打印它:

foreach ($result as $entry) {
    printf(
        '<a href="%s">%s</a><br>Tags: %s%s',
        urlencode($entry->url),
        htmlspecialchars($entry->name),
        htmlspecialchars($entry->tags),
        PHP_EOL
    );
}

关于您对多个标签元素的编辑:

上面的 XPath 已经找到了正确的条目。要显示所有标签,您可以更改行

htmlspecialchars($entry->tags),

to(不要忘记调整xpath来读取标签而不是标签):

implode_tags($entry->tag),

其中 implode_tags 函数被定义为

function implode_tags(\SimpleXMLElement $tags) {
    $allTags = [];
    foreach ($tags as $tag) {
        $allTags[] = htmlspecialchars($tag);
    }
    return implode(", ", $allTags);
}

这应该返回类似“deutsch, spanisch, englisch”的内容

https://eval.in/885485查看完整演示

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多