2015-01-26 67 views
0

我需要单独的管道之间的每个短语(|)
我有一些代码已经删除的开头有一些无用的垃圾,但没有什么下一步去哪里。

我的代码:
正则表达式的帮助 - PHP/XML

<style> 
table, th, td { 
border:1px solid black; 
} 
</style> 
<?php 

echo 'OK'; 

$xmlstr = file_get_contents('http://api.wolframalpha.com/v2/query?input=planes+seen+from+dallas&appid=2UJ62E-Q6RT3T89P8'); 


$queryresult = new SimpleXMLElement($xmlstr); 

echo $queryresult->pod[0]->subpod[0]->plaintext . "<hr>"; //assumption/input 
$work1 = $queryresult->pod[1]->subpod[0]->plaintext . "<hr>"; //result plaintext 
$work2 = substr($work1, 19); 
$work3 = utf8_decode($work2); 
$work4 = str_replace(utf8_decode('Â'), '', $work3); 
echo $work4; 

//echo "<table >" . "<tr><th>Plane Name</th><th>Altitude</th><th>Angle</th></tr>" . "<tr><td>Sample</td></tr></table>"; //Late 

echo "<br><br><h6>" . $queryresult . "</h6>"; 
?> 



而这里的XML文件注:内容是<plaintext>

<queryresult success="true" error="false" numpods="3" datatypes="Flight" timedout="" timedoutpods="" timing="3.39" parsetiming="0.391" parsetimedout="false" recalculate="" id="MSPa1551i7b4400e01ci84e0000651c4h328e38277i" host="http://www4b.wolframalpha.com" server="7" related="http://www4b.wolframalpha.com/api/v2/relatedQueries.jsp?id=MSPa1561i7b4400e01ci84e00005a6da8807558i27f&s=7" version="2.6"><pod title="Input interpretation" scanner="Identity" id="Input" position="100" error="false" numsubpods="1"><subpod title=""><plaintext>flights seen from Dallas, Texas</plaintext><img src="http://www4b.wolframalpha.com/Calculate/MSP/MSP1571i7b4400e01ci84e0000145h82ai4h4a9hae?MSPStoreType=image/gif&s=7" alt="flights seen from Dallas, Texas" title="flights seen from Dallas, Texas" width="199" height="18"/></subpod></pod><pod title="Result" scanner="Data" id="Result" position="200" error="false" numsubpods="1" primary="true"><subpod title=""><plaintext> | altitude | angle 
ENY flight 3056 | 11500 feet | 23° up 
Republic Airlines flight 4302 | 30000 feet | 11° up 
Southwest Airlines flight 4966 | 7200 feet | 10° up 
Delta Air Lines flight 1115 | 32000 feet | 6.9° up 
NetJets flight 579 | 5900 feet | 6.9° up 
| type | slant distance 
ENY flight 3056 | Embraer ERJ-145 | 5.5 miles NNW 
Republic Airlines flight 4302 | Embraer 175 | 30 miles SE 
Southwest Airlines flight 4966 | Boeing 737-800 | 7.7 miles N 
Delta Air Lines flight 1115 | Boeing 757-200 | 48 miles ENE 
NetJets flight 579 | Cessna Citation Excel | 9.3 miles ESE 
(locations based on projections of delayed data) 
(angles with respect to nominal horizon)</plaintext><img src="http://www4b.wolframalpha.com/Calculate/MSP/MSP1581i7b4400e01ci84e00003ea5887iecaa0i2a?MSPStoreType=image/gif&s=7" alt=" | altitude | angle ENY flight 3056 | 11500 feet | 23° up Republic Airlines flight 4302 | 30000 feet | 11° up Southwest Airlines flight 4966 | 7200 feet | 10° up Delta Air Lines flight 1115 | 32000 feet | 6.9° up NetJets flight 579 | 5900 feet | 6.9° up | type | slant distance ENY flight 3056 | Embraer ERJ-145 | 5.5 miles NNW Republic Airlines flight 4302 | Embraer 175 | 30 miles SE Southwest Airlines flight 4966 | Boeing 737-800 | 7.7 miles N Delta Air Lines flight 1115 | Boeing 757-200 | 48 miles ENE NetJets flight 579 | Cessna Citation Excel | 9.3 miles ESE (locations based on projections of delayed data) (angles with respect to nominal horizon)" title=" | altitude | angle ENY flight 3056 | 11500 feet | 23° up Republic Airlines flight 4302 | 30000 feet | 11° up Southwest Airlines flight 4966 | 7200 feet | 10° up Delta Air Lines flight 1115 | 32000 feet | 6.9° up NetJets flight 579 | 5900 feet | 6.9° up | type | slant distance ENY flight 3056 | Embraer ERJ-145 | 5.5 miles NNW Republic Airlines flight 4302 | Embraer 175 | 30 miles SE Southwest Airlines flight 4966 | Boeing 737-800 | 7.7 miles N Delta Air Lines flight 1115 | Boeing 757-200 | 48 miles ENE NetJets flight 579 | Cessna Citation Excel | 9.3 miles ESE (locations based on projections of delayed data) (angles with respect to nominal horizon)" width="496" height="456"/></subpod><states count="2"><state name="More" input="Result__More"/><state name="Show metric" input="Result__Show metric"/></states></pod><pod title="Sky map" scanner="Data" id="SkyMap:FlightData" position="300" error="false" numsubpods="1"><subpod title=""><plaintext/><img src="http://www4b.wolframalpha.com/Calculate/MSP/MSP1591i7b4400e01ci84e000035g7ag9dd130609a?MSPStoreType=image/gif&s=7" alt="" title="" width="400" height="400"/></subpod></pod><assumptions count="1"><assumption type="SubCategory" word="dallas" template="Assuming ${desc1}. Use ${desc2} instead" count="9"><value name="{Dallas, Texas, UnitedStates}" desc="Dallas (Texas, USA)" input="*DPClash.CityE.dallas-_**Dallas.Texas.UnitedStates--"/><value name="{Dallas, Georgia, UnitedStates}" desc="Dallas (Georgia, USA)" input="*DPClash.CityE.dallas-_**Dallas.Georgia.UnitedStates--"/><value name="{Dallas, Oregon, UnitedStates}" desc="Dallas (Oregon, USA)" input="*DPClash.CityE.dallas-_**Dallas.Oregon.UnitedStates--"/><value name="{Dallas, NorthCarolina, UnitedStates}" desc="Dallas (North Carolina, USA)" input="*DPClash.CityE.dallas-_**Dallas.NorthCarolina.UnitedStates--"/><value name="{Dallas, Pennsylvania, UnitedStates}" desc="Dallas (Pennsylvania, USA)" input="*DPClash.CityE.dallas-_**Dallas.Pennsylvania.UnitedStates--"/><value name="{Dallas, BritishColumbia, Canada}" desc="Dallas (Canada)" input="*DPClash.CityE.dallas-_**Dallas.BritishColumbia.Canada--"/><value name="{Dallas, Wisconsin, UnitedStates}" desc="Dallas (Wisconsin, USA)" input="*DPClash.CityE.dallas-_**Dallas.Wisconsin.UnitedStates--"/><value name="{Dallas, Maine, UnitedStates}" desc="Dallas (Maine, USA)" input="*DPClash.CityE.dallas-_**Dallas.Maine.UnitedStates--"/><value name="{Dallas, SouthDakota, UnitedStates}" desc="Dallas (South Dakota, USA)" input="*DPClash.CityE.dallas-_**Dallas.SouthDakota.UnitedStates--"/></assumption></assumptions><sources count="2"><source url="http://www.wolframalpha.com/sources/CityDataSourceInformationNotes.html" text="City data"/><source url="http://www.wolframalpha.com/sources/FlightDataSourceInformationNotes.html" text="Flight data"/></sources></queryresult> 
+1

我没有看到任何管...... – chris85 2015-01-26 23:27:47

+0

@ chris85哎呀我的错我会显示其他代码 – 2015-01-26 23:35:51

+0

'我有一些代码已经在一开始正则表达一些无用的垃圾'我没有看到任何正则表达式? – cbreezier 2015-01-26 23:52:21

回答

1

[编辑] 它本身ems该实体问题只是由于@ThW注意到它的复制/粘贴/错字。所以,要走的路是使用XMLReader来提取数据。

优点:它是PHP中可用的最快的XML解析器(因为它不需要构建DOM树,它是基于事件的解析器)。即使它比正则表达式慢一点,它使用较少的内存,不需要加载完整的文档。

提取字符串:

$url = 'http://api.wolframalpha.com/v2/query?input=planes+seen+from+dallas&appid=2UJ62E-Q6RT3T89P8'; 

$parser = new XMLReader; 
$parser->open($url); 

while ($parser->read()) { 
    if ($parser->nodeType === XMLReader::ELEMENT) { 

     while ($parser->name === 'pod' && $parser->getAttribute('title') !== 'Result') 
      $parser->next('pod'); // jump to the next pod node 

     if ($parser->name === 'plaintext') { 
      $str = $parser->readString(); 
      $parser->close();  
      break; 
     } 
    } 
} 

然后就可以从所提取的字符串产生一个结果,例如,通过航班多维数组:

$lines = explode("\n", $str); 
$result = array(); 

foreach ($lines as $line) { 
    $fields = explode(' | ', $line); 
    $flight = array_shift($fields); 

    if ($flight === '') 
     $cols = $fields; 
    elseif (isset($fields[1])) { 
     $result[$flight][$cols[0]] = $fields[0]; 
     $result[$flight][$cols[1]] = $fields[1]; 
    } 
} 

print_r($result); 

[旧答案] 不幸的是,实体(属性中带有&字符)会导致XMLReader失败(这是您的最佳方式)。

所以,一个快速肮脏的方式:

$pattern = '~title="Result".*?<plaintext>\K[^<]+~s'; 

if (preg_match($pattern, $xml, $m)) { 
    $result = array_map("ltrim", preg_split('~[\n|]\s*~', $m[0], -1, PREG_SPLIT_NO_EMPTY)); 
    print_r($result); 
} 

或者是一个小更有效,你可以换着花样来:

~title="Result"(?:[^<]+|<(?!plaintext))*+<plaintext>\K[^<]+~s 
+0

我会检查出来,Thx – 2015-01-27 00:28:31

+0

我认为'&'是一个复制+粘贴错误。如果你在问题中打开url,它将返回有效的xml。 – ThW 2015-01-27 13:43:21

+0

@ThW:事实上,我已经解决了我的问题。 – 2015-01-27 16:24:28