2013-02-05 28 views
0

我的數據如下所示。解析PHP中的文本文件,其中數據的格式發生變化

123456 abc1 (aaa: [bbb]aaa) http://exampleurl.org.uk 

654321 cba2 (bbb: aa7) http://urlexample.org.uk 
... 

我想將每一行分成3個字符串,所以我可以把它們放到一個數組中。 E.g:

string 1 = 123456 

string 2 = abc1 (aaa: [bbb]aaa) 

string 3 = http://exampleurl.org.uk 

我的問題是,第二個字符串經常有很多不同格式的改變。第一個字符串總是相似的,最後一個字符串總是一個url。

編輯:我注意到,如果這有幫助,所有的第二個字符串結束括號')'。

我打算使用explode(),但我不知道如何處理第二個字符串。有什麼建議?

+0

如果在第二個字符串的末尾總是有一個右括號,則可以使用正則表達式。或者你可以使用一個在開始處提取任何數字並在字符串「https?://」之後的任何數字。 – feeela

回答

1

雖然我可能只是使用正則表達式,這也是一個選項:

function parse($str) 
{ 
    $parts = explode(" ", $str); 

    // first part of the exploded str 
    $number = array_shift($parts); 

    // last part of the exploded str 
    $url = array_pop($parts); 

    // all thats left is the middle str 
    $between = trim(implode(" ", $parts), " "); 

    return array($number, $between, $url); 
} 

$str = "123456 abc1 (aaa: [bbb]aaa) http://exampleurl.org.uk"; 

print_r(parse($str)); 

輸出:

array (size=3) 
    0 => string '123456' (length=6) 
    1 => string 'abc1 (aaa: [bbb]aaa)' (length=20) 
    2 => string 'http://exampleurl.org.uk' (length=24) 
+1

你可以'$ number = $ parts [0]; unset($ parts [0]);'而不是'array_shift()',因爲你不在乎這裏的密鑰,並且在大文件上會更快。 –

1

使用正則表達式:

$input = "123456 abc1 (aaa: [bbb]aaa) http://exampleurl.org.uk"; 
preg_match("/([0-9]+)\s+(.+)\s+(http:\/\/.*)/i", $input, $matches); 

這將結果保存到$matches大號

Array 
(
    [0] => 123456 abc1 (aaa: [bbb]aaa) http://exampleurl.org.uk 
    [1] => 123456 
    [2] => abc1 (aaa: [bbb]aaa) 
    [3] => http://exampleurl.org.uk 
) 
1

您的格式其實很簡單:

Number - Space(s) - Random Stuff - Space(s) - URL 

因此,所有你需要的是像這樣的正則表達式:

^(\d+)\s+(.*?)\s+(URL)$ 

其中URL是您在URL匹配正則表達式中的首選項。

+0

感謝您的回覆!第一個字符串有時也可以包含字母和符號,但從來沒有空格。那麼這會讓我更容易找到第一個空間嗎? –

0

如果總有$string1$string2之間的空間或總是標籤$string3你可以這樣做:

$line = '123456 abc1 (aaa: [bbb]aaa) http://exampleurl.org.uk'; 
$string1 = substr($line, 0, ($pos = strpos($line, ' '))); // use "\t" instead of ' ' if tab is delimiter 
$string2 = trim(substr($line, $pos, ($pos2 = strrpos($line, ' ')) - $pos)); 
$string3 = substr($line, $pos2 + 1); 

這將比正則表達式或爆炸和加入陣列要快得多