2012-08-14 68 views
0

我正在处理一个脚本,它从维基百科获取数据。字符串脱机字符

一个常见的问题是,例如我想获取:

北斯特德布鲁克岛

但是,我们获取的字符串的下方,所以需要删除垃圾

[[North Stradbroke Island]]' 

电流刮代码是:

$curl_handle=curl_init(); 
curl_setopt($curl_handle,CURLOPT_URL,"http://en.wikipedia.org/wiki/Special:Export/" . $wiki['suburb'] . ",_" . $wiki['state'] . ""); 
curl_setopt($curl_handle,CURLOPT_TIMEOUT,10); 
curl_setopt($curl_handle,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); 
curl_setopt($curl_handle,CURLOPT_CONNECTTIMEOUT,10); 
curl_setopt($curl_handle,CURLOPT_RETURNTRANSFER,1); 
$xml = curl_exec($curl_handle); 
curl_close($curl_handle); 

$x = simplexml_load_string($xml); 
$text = $x->page->revision->text; 

$arr = explode("| ", $text); 

$wikipedia = array(); 
foreach($arr as $s){ 
    $pair = preg_split('/= /', $s); 
    $key = substr($pair[0],0,strpos($pair[0]," ")); 
    switch($key){ 
     case "lga": 
     case "pop": 
     case "dist1": 
      $wikipedia[$key] = substr($pair[1],0,-1); 
      break; 
     case "near-nw": 
     case "near-n": 
     case "near-ne": 
     case "near-w": 
     case "near-e": 
     case "near-sw": 
     case "near-s": 
     case "near-se": 
      $value = $pair[1]; 
      if($value != ""){ 
       $value =substr($pair[1],2,strpos($pair[1],",")-2); 
      } 
      $wikipedia[$key] = $value; 
      break; 
    } 
} 

在我的页面上我有:

<? 
    $wiki['suburb'] = str_replace(" ", "_", $r['suburb']); 
    $wiki['state'] = convertStateWiki($r['state']); 
    include("/path-to-wiki-file/wiki.suburb.php"); 
    if ($wikipedia != NULL){ 
?> 

和呼应的结果:(例子)

<a href="reviews/<?=strtolower($r['state']);?>/<?=strtolower(str_replace(" ", "-", $wikipedia['near-nw']));?>/"><?=$wikipedia['near-nw'];?></a> 

所以基本上:我们用抢出口维基饲料,郊区。这市郊,可能已经被输入到像维基百科:

[“部分市郊名称]”例如

我需要返回上面的:部分市郊名称

我们需要去除所有非ALPHA字符,我不是100%的PHP,所以如果这听起来很愚蠢,请随时这么说。但请不要投下,因为我已经提供了尽可能多的代码。

我只是需要从包括什么,但字母字符停止返回的数据(必须允许空格)

+0

可能重复非字母数字或标点](http://stackoverflow.com/questions/3050352/regex-strip-non-alpha-numeric-or-punctuation) – mario 2012-08-14 01:18:48

+0

重复?我了解你发布的参考网址,但不是评论可能是重复的,或者你的意思是这个问题是重复的?如果是这样,我不明白如何将您在我的代码中发布的内容整合到 – 422 2012-08-14 01:23:12

+1

以上。重复此处意味着类似。它类似*足够*让你开始。同一主题肯定有*更确切的答案(剥离非字母字符)。它主要是作为参考。链接很酷。 – mario 2012-08-14 01:26:12

回答

-1

“需要删除垃圾”的垃圾被称为维基标记,这是机器可读的。这里有一个解析器列表:http://www.mediawiki.org/wiki/Alternative_parsers

如果你将去除所有非字母数字字符,那么你将最终得到大量的信息丢失。只需解析标记,然后以任何你喜欢的格式输出。

1

Wiki标记其实是非常有据可查的。

然而,对于你的情况,一个简单的trim($str, "[]'")应该这样做:)

你的情况:

$wiki['suburb'] = str_replace(" ", "_", trim($r['suburb'], "[]'")); 
+0

目前我有:$ wiki ['suburb'] = str_replace(“”,“_”,$ r ['suburb']);但使用修剪时我只能通过2个paramateres。Wiki增加了元素[[]]' – 422 2012-08-14 01:42:53

+0

@ 422第二个参数指向'trim()'带有它需要修剪的字符列表;我的代码也修剪方括号。 – 2012-08-14 01:44:25

+0

仍然有点困惑:所以我应该使用: $ wiki ['suburb'] = str_replace(“”,“_”,$ r ['suburb']); $ wiki ['suburb'] = trim($ str,“[]'”,$ r ['suburb']); – 422 2012-08-14 01:53:52

1

在这里你去:条:正则表达式的

<?php 
$place = $wikipedia['near-nw']; 
$place = trim($place, "[]'"); 
$href = str_replace(" ", "-", $place); 
?> 
<a href="reviews/<?=strtolower($r['state'] . "/" . $href);?>/"><?=$place;?></a>