假设我想使用php读取文本文件。
现在我的文本文件包含
User=Test
Age=18
Gender=F
User=Test2
Age=34
Gender=M
并且跟着这样。
现在假设我想使用php来读取文本文件,只找到User =的值并显示它。
实现这一目标的最简单方法是什么?
谢谢。
答案 0 :(得分:4)
这可能比您正在寻找的更多,但如果您要解析文本文件 并且你没有依赖于特定格式,你应该使用php内置支持的格式。对我来说,最明显的两个选项是XML和JSON。恕我直言JSON可能是最简单的。
在您的示例中,数据文件可能如下所示
[
{
'User':'Test',
'Age':18,
'Gender':'F'
},
{
'User':'Test2',
'Age':34,
'Gender':'M'
}
]
从中读取的php将是
contents = file_get_contents($filename);
$contents = utf8_encode($contents);
$m = json_decode($contents);
现在你可以像使用任何数组一样使用$ m
foreach( $m as $user )
{
print $user->User . "\n";
}
答案 1 :(得分:1)
除非您正在寻找特定值,否则您基本上必须将整个文件读入内存。您可以逐行阅读并输出以“User”开头的任何行,如下所示:
$fp = fopen("test_input.txt","r");
while(! feof($fp)) {
$line = fgets($fp);
if (substr($line,0,5) == "User=") echo substr($line,5);
}
fclose($fp);
如果您希望以更有用的形式提供信息,可以将其分解为一组用户。假设文件的每个“部分”都用双换行符分隔,你可以这样做:
$out = array();
$contents = file_get_contents('test_input.txt');
$blocks = explode("\n\n",$contents);
foreach($blocks as $b)
{
$user = array();
$lines = explode("\n",$b);
foreach($lines as $line) {
list($key,$value) = explode("=",$line,2);
$user[$key] = $value;
}
$out[] = $user;
}
//now have an array of user info
foreach($out as $i) echo $i['User'];
显然,这会假设你的数据(例如用“\ n”字符分隔的所有行),但你明白了。
答案 2 :(得分:1)
$filename = "users.txt";
$user_file_array = file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
//Now you have an array of each line of the file.
foreach($user_file_array as $user_info) {
if(strpos($user_info, "User=") !== false) {
$users[] = str_replace("User=", "", $user_info);
}
}
以上假设每一行信息都在一个新行上,User=
区分大小写,并且您可以循环遍历整个文件。您将获得一个仅返回User=
右侧用户名的数组。
如果您希望在列中回显它,请更改$ users数组构建的位,或者将其添加到结尾:
echo implode("\n" $users);
答案 3 :(得分:0)
您可以尝试fgets()获取文件的一行,并将开头的子字符串测试它是否以正确的文本开头。可能有更简单的方法。
答案 4 :(得分:0)
请输入此代码
<?php
$file = "test.txt";
$userArr=array();
$f = fopen($file, "r");
while ( $line = fgets($f) )
{
$lineArr = explode('=',$line);
if($lineArr[0]=='User')
{
echo "User Name: ".$lineArr[1];
echo "<br/>";
$userArr[] = $lineArr[1];
}
}
print_r($userArr);
?>
了解更多信息请点击here
答案 5 :(得分:0)
<?php
$lines = array();
$file = fopen("sample.txt", "r") or exit("Unable to open file!");
//Output a line of the file until the end is reached
$i = 0;
while(!feof($file))
{
$i++;
$lines[$i] = fgets($file). "<br />";
}
fclose($file);
$matches = preg_grep("/^User=(.*)/", $lines);
print_r($matches);
?>
取自http://php.net/manual/en/function.preg-grep.php,http://www.phpfreaks.com/forums/index.php?topic=213127.0
答案 6 :(得分:0)
如果您与您描述的格式结婚/坚持,那么您可以在下面试用我的代码。它会给你一个很好的数组,你可以轻松地使用它。否则,我建议您使用Michael Anderson's advice并切换到JSON,因为它可以节省您的时间并使事情正常化。
$rawData = file_get_contents("data.txt");
$users = array();
$tmpUser = array();
foreach ( file("data.txt", FILE_IGNORE_NEW_LINES) as $line ) {
// Blank line denotes the end of a record
if ( empty($line) ) {
$users[] = $tmpUser;
$tmpUser = array();
continue;
}
list($key, $value) = explode("=", $line, 2);
$tmpUser[ strtolower(trim($key)) ] = trim($value);
}
// Add last record
if ( !empty($tmpUser) ) {
$users[] = $tmpUser;
}
print_r($users);
结果
Array
(
[0] => Array
(
[user] => Test
[age] => 18
[gender] => F
)
[1] => Array
(
[user] => Test2
[age] => 34
[gender] => M
)
)
我意识到你特意要求能够获得用户名;但是,无论你想要完成什么,这都可能更有益。