从.txt文件(PHP)中提取数据

从.txt文件(PHP)中提取数据,php,parsing,Php,Parsing,使用PHP,是否有更好的方法从文本文件中提取适当的信息位,而无需使用strpos和substr PHP函数 我需要提取“课程xxx”,编号和参考号 示例:主题为“课程1…”的记录结果为: 课程1 8415 152 Example.txt文件: Name: Dave Age: 15 Subject: Course 1 (No: 8415, Ref: #152#) Description: Description 1 Name: John Age: 28 Subject: Course

使用PHP,是否有更好的方法从文本文件中提取适当的信息位,而无需使用strpos和substr PHP函数

我需要提取“课程xxx”,编号和参考号

示例:主题为“课程1…”的记录结果为:

  • 课程1
  • 8415
  • 152
Example.txt文件:

Name: Dave
Age: 15
Subject: Course 1 (No: 8415, Ref: #152#)
Description:

Description 1



Name: John
Age: 28
Subject: Course 2 (No: 646544, Ref: #325#)
Description:

Description 1



Name: Steve
Age: 22
Subject: Course 3 (No: 545, Ref: #451#)
Description:

Description 1

编辑:注意我不需要提取所有数据,但所有数据仍将保存在文件中

看看这两个PHP函数:


看看这两个PHP函数:


对此,您可能需要使用正则表达式。它会变得有点复杂,但不会像
strpos
substr
那么糟糕

首先,这里有一个正则表达式,它将匹配名称:值对-

$matches = array();
preg_match_all('/^([^\s:]+):\s*(.+)$/m', $data, $matches);

print_r($matches);
编辑:我很好奇,完成了正则表达式,这里是它的全部-

preg_match_all('/^([^\s:]+):\s*(.+?)(?:\s*\(([^\s:]+):\s*(.+),\s*([^\s:]+):\s*(.+)\))?$/m', $data, $matches);

您可能会希望为此使用正则表达式。它会变得有点复杂,但不会像
strpos
substr
那么糟糕

首先,这里有一个正则表达式,它将匹配名称:值对-

$matches = array();
preg_match_all('/^([^\s:]+):\s*(.+)$/m', $data, $matches);

print_r($matches);
编辑:我很好奇,完成了正则表达式,这里是它的全部-

preg_match_all('/^([^\s:]+):\s*(.+?)(?:\s*\(([^\s:]+):\s*(.+),\s*([^\s:]+):\s*(.+)\))?$/m', $data, $matches);
if(preg\u match\u all('~')。
'名称:\\s*(?。+?)\r?\n'.//名称
'年龄:\\s*(?[0-9]+)\r?\n.//年龄
'主题:\\s*(?。+?)\\s*\\('.//主题
'否:\\s*(?[0-9]+)\\s*,'。//否
“\\s*Ref:\\s*#(?[0-9]+)#”。//Ref
“\\)\r?\n.///主题
'说明:\\s*(?。+?)\r?\n'.//说明
“~si',$AccountDump,$Matches)){
$Names=$Matches['Name'];
$Ages=$Matches['Age'];
$Subject=$Matches['Subject'];
$Nos=$Matches['No'];
$Refs=$Matches['Ref'];
$Description=$Matches['Description'];
$Accounts=array();
foreach($Key=>$Name的名称){
$Accounts[$Key]=数组_映射('trim',数组(
“Name”=>$Name,
“年龄”=>$Ages[$Key],
“主题”=>$Subjects[$Key],
“否”=>$Nos[$Key],
“Ref”=>$Refs[$Key],
'Description'=>$Descriptions[$Key],
));
}
//找到了!
var_dump($账户);
}
在名为$AccountDump的变量中加载文本

玩得开心。在您的样品上进行测试,效果良好。 我已经拆分了RegExp,以便您可以根据需要跟踪它

希望它能起作用

if(preg\u match\u all('~')。
'名称:\\s*(?。+?)\r?\n'.//名称
'年龄:\\s*(?[0-9]+)\r?\n.//年龄
'主题:\\s*(?。+?)\\s*\\('.//主题
'否:\\s*(?[0-9]+)\\s*,'。//否
“\\s*Ref:\\s*#(?[0-9]+)#”。//Ref
“\\)\r?\n.///主题
'说明:\\s*(?。+?)\r?\n'.//说明
“~si',$AccountDump,$Matches)){
$Names=$Matches['Name'];
$Ages=$Matches['Age'];
$Subject=$Matches['Subject'];
$Nos=$Matches['No'];
$Refs=$Matches['Ref'];
$Description=$Matches['Description'];
$Accounts=array();
foreach($Key=>$Name的名称){
$Accounts[$Key]=数组_映射('trim',数组(
“Name”=>$Name,
“年龄”=>$Ages[$Key],
“主题”=>$Subjects[$Key],
“否”=>$Nos[$Key],
“Ref”=>$Refs[$Key],
'Description'=>$Descriptions[$Key],
));
}
//找到了!
var_dump($账户);
}
在名为$AccountDump的变量中加载文本

玩得开心。在您的样品上进行测试,效果良好。 我已经拆分了RegExp,以便您可以根据需要跟踪它

希望它能起作用

你可以

$data = file_get_contents("log.txt");
$data = array_chunk(array_filter(array_map("trim",explode(chr(13).chr(10).chr(13), $data))),2);
$lists = array();

foreach ( $data as $value ) {
    $list = array();
    foreach ( explode("\n", implode("", $value)) as $item ) {
        list($key, $value) = explode(":", $item);
        $list[trim($key)] = trim($value);
    }
    $lists[] = $list;
}
var_dump($lists);
输出

array
  0 => 
    array
      'Name' => string 'Dave' (length=4)
      'Age' => string '15' (length=2)
      'Subject' => string 'Course 1 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
  1 => 
    array
      'Name' => string 'John' (length=4)
      'Age' => string '28' (length=2)
      'Subject' => string 'Course 2 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
  2 => 
    array
      'Name' => string 'Steve' (length=5)
      'Age' => string '22' (length=2)
      'Subject' => string 'Course 3 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
你可以

$data = file_get_contents("log.txt");
$data = array_chunk(array_filter(array_map("trim",explode(chr(13).chr(10).chr(13), $data))),2);
$lists = array();

foreach ( $data as $value ) {
    $list = array();
    foreach ( explode("\n", implode("", $value)) as $item ) {
        list($key, $value) = explode(":", $item);
        $list[trim($key)] = trim($value);
    }
    $lists[] = $list;
}
var_dump($lists);
输出

array
  0 => 
    array
      'Name' => string 'Dave' (length=4)
      'Age' => string '15' (length=2)
      'Subject' => string 'Course 1 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
  1 => 
    array
      'Name' => string 'John' (length=4)
      'Age' => string '28' (length=2)
      'Subject' => string 'Course 2 (No' (length=12)
      'Description' => string 'Description 1' (length=13)
  2 => 
    array
      'Name' => string 'Steve' (length=5)
      'Age' => string '22' (length=2)
      'Subject' => string 'Course 3 (No' (length=12)
      'Description' => string 'Description 1' (length=13)

我使用了strpos和substr,但它很混乱,“描述1”部分是什么?Rest很容易用正则表达式提取。问题是。。。文件的整个结构是否一致?(就像我可以用作分隔符的2个输入)和is描述:始终是一行?编辑:我刚刚注意到我没有删除所有提取的数据,但所有数据仍将保存在文件中。@Claudrian是的,文件格式始终相同,描述始终在一行上,下面有空行。我用过strpos和substr,但很混乱,“描述1”部分是什么?Rest很容易用正则表达式提取。问题是。。。文件的整个结构是否一致?(就像我可以用作分隔符的2个输入)和is描述:始终是一行?编辑:我刚刚注意到我没有删除所有提取的数据,但所有数据仍将保存在文件中。@Claudrian是的,文件格式始终相同,描述始终在一行上,下面有空行。与其说是回答,不如说是评论。有人知道有一个网站可以为你创建正则表达式吗?您只需输入匹配项(您正在搜索的内容)即可?在构建正则表达式时非常有用。这个网站的灵感来源于一个商业产品regexbuddy,我在过去的几年里成功地使用了它。与其说它是一个答案,不如说它是一个评论。有谁知道一个网站可以为你创建正则表达式?您只需输入匹配项(您正在搜索的内容)即可?在构建正则表达式时非常有用。该网站的灵感来源于一款商业产品regexbuddy,多年来我一直在使用它