在PHP中解析文本文件,其中数据的格式会发生更改

在PHP中解析文本文件,其中数据的格式会发生更改,php,parsing,text-files,Php,Parsing,Text Files,我的数据是这样的 123456 abc1 (aaa: [bbb]aaa) http://exampleurl.org.uk 654321 cba2 (bbb: aa7) http://urlexample.org.uk ... 我想把每一行分成3个字符串,这样我就可以把它们放到一个数组中。 例如: 我的问题是,第二个字符串经常以许多不同的格式变化。第一个字符串总是相似的,最后一个字符串总是url 编辑:我注意到所有第二个字符串都以括号结尾,如果这有帮助的话 我打算使用explode

我的数据是这样的

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

654321 cba2 (bbb: aa7)  http://urlexample.org.uk
...
我想把每一行分成3个字符串,这样我就可以把它们放到一个数组中。 例如:

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

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


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

使用正则表达式:

$input = "123456  abc1 (aaa: [bbb]aaa)    http://exampleurl.org.uk";
preg_match("/([0-9]+)\s+(.+)\s+(http:\/\/.*)/i", $input, $matches);
这将把结果存储到
$matches
L中

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

使用正则表达式:

$input = "123456  abc1 (aaa: [bbb]aaa)    http://exampleurl.org.uk";
preg_match("/([0-9]+)\s+(.+)\s+(http:\/\/.*)/i", $input, $matches);
这将把结果存储到
$matches
L中

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

您的格式实际上非常简单:

Number - Space(s) - Random Stuff - Space(s) - URL
因此,您只需要这样一个正则表达式:

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

其中
URL
是您在URL匹配正则表达式中的首选项。

您的格式实际上非常简单:

Number - Space(s) - Random Stuff - Space(s) - URL
因此,您只需要这样一个正则表达式:

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

其中
URL
是您在URL匹配正则表达式中的首选项。

虽然我可能只使用正则表达式,但这也是一个选项:

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)

虽然我可能只使用正则表达式,但这也是一个选项:

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)

如果
$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);

如果在
$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);

这将比正则表达式或分解并合并数组快得多

如果在第二个字符串的末尾始终有一个右括号,则可以使用正则表达式。或者,您可以使用一个在字符串开头提取任何数字以及字符串
https?://
之后的任何内容。如果在第二个字符串的末尾始终有一个右括号,则可以使用正则表达式。或者,您可以使用一个在开头提取任何数字,并在字符串
https?://
之后提取任何数字。感谢您的回复!第一个字符串有时也可以包含字母和符号,但没有空格。这会不会让我在寻找第一个空间时更容易些?谢谢你的回复!第一个字符串有时也可以包含字母和符号,但没有空格。那么,在我只查找第一个空格时,这样做会更容易吗?您可以
$number=$parts[0];未设置($parts[0])
而不是
array_shift()
,因为您不关心此处的键,而且在大文件上会更快。您可以
$number=$parts[0];未设置($parts[0])
而不是
array\u shift()
,因为您不关心这里的键,而且在大文件上会更快。