2014-10-07 60 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>";