在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()
,因为您不关心这里的键,而且在大文件上会更快。