【问题标题】:Retrieve text from XML?从 XML 中检索文本?
【发布时间】:2014-10-07 21:15:35
【问题描述】:

我想从数组中获取 XML 标记之间的所有单词,当前结果是:

注意:第 84 行 ........ 中的数组到字符串的转换

结果是:数组

if(isset($_POST['send']))
{
    echo "sync is started <br>";
    $handle = fopen("XML/$file_name", "r");
    if ($handle)
    {
        while (($line = fgets($handle)) !== false)
        {
            $keywords=array("series_title","series_type","series_episodes");
            for ($i=0; $i < 3; $i++)
            {       
                $pattern = "/<$keywords[$i]>(.*?)<\/keywords[$i]>/";
                preg_match($pattern, $line, $matches);
                echo "result is: " . $matches . "<br>";
            }
        }
    }
    else
    {
        $upload_text = "error"; 
    }

    $upload_text ="finished";
    fclose($handle);
    //unlink('XML/' . $file_name);
}

【问题讨论】:

  • 您能否发布一个您尝试解析的原始数据示例,您是否有任何理由不使用 XML 解析器?
  • 您正在尝试回显 $matches 这是一个数组。您需要循环并打印数组中找到的每个匹配项
  • $matches 是一个数组,所以你可以这样做:echo "result is: " . implode(", ", $matches) . "&lt;br&gt;"; 但实际上,请考虑使用 SimpleXML php.net/manual/en/intro.simplexml.php
  • 是的,SimpleXML 是要走的路!
  • 谢谢我会试试这个:) 不知道有一个解析器或工具集来读取 xml。

标签: php arrays tags preg-match


【解决方案1】:

您应该改用SimpleXML 来读取XML。这是一个例子:

<?php
$string = <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<myanimelist>
    <anime>
        <series_animedb_id>1143</series_animedb_id>
        <series_title><![CDATA[.hack//Intermezzo]]></series_title>
        <series_type>Special</series_type>
        <series_episodes>1</series_episodes>
    </anime>
    <anime>
        <series_animedb_id>299</series_animedb_id>
        <series_title><![CDATA[.hack//Liminality]]></series_title>
        <series_type>OVA</series_type>
        <series_episodes>4</series_episodes>
    </anime>
</myanimelist>
XML;

$result = simplexml_load_string($string);
foreach ($result->anime as $anime)
{
    echo trim($anime->series_title), "\n";
    echo $anime->series_type, "\n";
    echo $anime->series_episodes, "\n";
    echo "==========================\n\n";
}

Live DEMO.

在您的情况下,您将使用simplexml_load_file,因此您的代码将如下所示:

<?php
$result = simplexml_load_file('your_file_path_here.xml');
foreach ($result->anime as $anime)
{
    echo trim($anime->series_title), "\n";
    echo $anime->series_type, "\n";
    echo $anime->series_episodes, "\n";
}

【讨论】:

  • 谢谢,我明天试试看能不能让它工作:)
【解决方案2】:

好吧,正如您在Official PHP Documentation 中看到的,可选的preg_match 第三个参数将是一个数组

匹配

如果提供了匹配项,则将其填充为搜索结果。 $matches[0] 将包含匹配完整模式的文本, $matches1 将具有匹配第一个捕获的文本 带括号的子模式,等等。

所以简单地改变你的:

echo "result is: " . $matches . "<br>";

到:

echo "result is: " . $matches[1] . "<br>";

希望对你有帮助

【讨论】:

  • 当我这样做时,我得到:注意:未定义的偏移量:第 83 行 C:\xampp\htdocs\import.php 中的 1 结果是:
  • @ThaLioN mmm,您的正则表达式模式$pattern = "/&lt;$keywords[$i]&gt;(.*?)&lt;\/$keywords[$i]&gt;/"; 中缺少$ 符号
【解决方案3】:

preg_match函数的$matches参数中返回的值是一个数组,第一个元素是整个匹配,后面的元素是捕获组(括号之间的部分)。

因此,在您的代码中,您只对 $matches[1] 感兴趣:

echo "result is: $matches[1]<br>";

【讨论】:

    猜你喜欢
    • 2020-04-07
    • 2012-04-18
    • 1970-01-01
    • 2022-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多