2014-10-07 61 views
0

我想XML标记之间的所有单词从阵列和目前的结果是:从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); 
} 
+0

难道您发布的原始数据的一个例子,你试图解析,是否有任何理由,而不是使用XML解析器? – Prix 2014-10-07 21:17:18

+0

你正在尝试回显'$ matches'这是一个数组。您需要遍历并打印阵列中找到的每个匹配项 – ElefantPhace 2014-10-07 21:19:38

+1

$ matches是一个数组,因此您可以这样做:'echo“结果为:”。 implode(“,”,$ matches)。 “
”;'但是真的,使用SimpleXML看看http://php.net/manual/en/intro.simplexml.php – dave 2014-10-07 21:19:52

回答

0

您应该使用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"; 
} 
+0

谢谢,我会尝试它tommorow,看看我能否得到它的工作:) – ThaLioN 2014-10-07 22:30:29

0

那么,你可以在Official PHP Documentation阅读,可选preg_match第三个参数将是一个数组

匹配

如果提供匹配项,则会填充搜索结果。 $匹配[0]将包含匹配完整模式的文本, $匹配1将具有匹配第一个捕获的 括号内子模式的文本,依此类推。

所以,简单地改变你的:

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

到:

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

希望它可以帮助

+0

当我这样做时,我得到: 注意:未定义偏移量:1在C:\ xampp \ htdocs \ import.php上线83 结果是: – ThaLioN 2014-10-07 22:03:23

+0

@ThaLioN mmm,您的正则表达式模式'$ pattern =“/<$keywords[$i]>(.*?)<\/$keywords[$i]>/”;中缺少'$'符号。 ' – 2014-10-07 22:16:28

0

在$返回的值相匹配的preg_match函数的参数是一个数组,第一个元素是整个匹配,以下元素是捕获组(括号之间的部分)。

所以,在你的代码,你只感兴趣的$匹配[1]:

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