【问题标题】:Read text file and display part of line读取文本文件并显示部分行
【发布时间】:2014-05-20 16:28:08
【问题描述】:

我正在创建一个计数器。 注册访问者在那里的脚本会创建一个像这样的 .txt 文件

 IP Adress:127.0.0.1

 Timestamp:1400602795

 User Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36

 Times visited:1

我希望能够获得时间戳和访问时间等信息。 我想这样做的一种方法是创建一个由“:”分隔的数组。

我尝试创建数组,但由于某种原因,“访问次数”未包含在数组中。这是该尝试的代码:

$fileResource = @fopen("hits/".$_SERVER["REMOTE_ADDR"].".txt","r");
$fileContent = @fread($fileResource,100000);

$array = preg_match_all("/(.*):(.*)\\n/i",$fileContent,$fileMatches);
//0 = IP
//1 = Timestamp
//2 = User Agent
//3 = Times Visited
echo $fileMatches[0][3];

这是我尝试 print_r($fileMatches) 时的输出

Array

( [0] => 数组 ( [0] => IP 地址:127.0.0.1

        [1] => Timestamp:1400604101

        [2] => User Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36

    )

[1] => Array
    (
        [0] => IP Adress
        [1] => Timestamp
        [2] => User Agent
    )

[2] => Array
    (
        [0] => 127.0.0.1
        [1] => 1400604101
        [2] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36
    )

)

【问题讨论】:

  • 请展示您尝试过的一些方法。 preg_match_all 是这样做的方法。只是不要忘记为正则表达式添加多行开关。
  • 这样的东西应该可以工作|([^:.+]):([^:.+])\n|s。不确定懒惰,还必须检查应该停止正则表达式匹配的换行符。
  • 遍历每一行,首先找到:(使用strpos()),获取之前和之后的所有内容(使用substr())并创建您的数组。 (使用trim() 去除空格。)
  • 我已经编辑了帖子并添加了更多信息

标签: php arrays string search


【解决方案1】:

如果您已经将文件的全部内容读入字符串,您可以像这样使用explode 两次:

$s = <<<EOT
IP Address:127.0.0.1

Timestamp:1400602795

User Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36

Times visited:1
EOT;

$arr = array();
foreach (explode("\n", $s) as $line) {    
    if (trim($line) !== '') { // check for empty line
        list($key, $value) = explode(':', $line);   
        $arr[$key] = trim($value);
    }
}
print_r($arr);

这样创建一个数组:

Array ( 
    [IP Address] => 127.0.0.1 
    [Timestamp] => 1400602795 
    [User Agent] => Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/537.36 
    [Times visited] => 1 
) 

或者,您可以使用fgets 来逐行读取每一行,并将foreach 循环替换为while (fgets($fileResource)) 之类的东西,而不是使用fread

【讨论】:

  • 只是一个简单的问题,
  • @robin00212 我用heredoc 编写了示例输入。这只是编写多行字符串的一种方式。 EOT 可以是任何其他标记,例如 &lt;&lt;&lt;ENDOFSTRING,它只是一种标识字符串结尾的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-07
相关资源
最近更新 更多