0

我的数据看起来像这样。

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

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

我想将每一行分成 3 个字符串,所以我可以将它们放入一个数组中。例如:

string 1 = 123456   

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

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

我的问题是第二个字符串经常以许多不同的格式发生变化。第一个字符串总是相似的,最后一个字符串总是一个 url。

编辑:如果这有帮助,我注意到所有第二个字符串都以括号')'结尾。

我打算使用 explode() 但我不确定如何处理第二个字符串。有什么建议吗?

4

4 回答 4

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)
于 2013-02-05T21:51:23.540 回答
1

使用正则表达式:

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

这会将结果存储到$matchesL

Array
(
  [0] => 123456  abc1 (aaa: [bbb]aaa)    http://exampleurl.org.uk
  [1] => 123456
  [2] => abc1 (aaa: [bbb]aaa)   
  [3] => http://exampleurl.org.uk
)
于 2013-02-05T21:46:29.183 回答
1

您的格式实际上很简单:

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

所以你只需要一个像这样的正则表达式:

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

URL您在 URL 匹配正则表达式中的偏好在哪里。

于 2013-02-05T21:47:01.543 回答
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);

这将比正则表达式或爆炸和连接数组快得多

于 2013-02-05T21:56:14.953 回答