V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hongqigong
V2EX  ›  PHP

如何写 PHP 查询 TXT 文件内容

  •  
  •   hongqigong · 2015-11-03 11:53:14 +08:00 · 4852 次点击
    这是一个创建于 3315 天前的主题,其中的信息可能已经有所发展或是发生改变。

    各位技术帝,帮忙写个 PHP 查询 TXT 里面内容的查询页面

    如: TXT 内容
    张三----2015 年 10 月 2 日 10 时[email protected]
    李四----2015 年 10 月 2 日 10 时[email protected]
    王五----2015 年 10 月 2 日 10 时[email protected]

    PHP 页面输入 [email protected] 此邮箱就能显示张三这条信息,输入其他的则不返回信息

    如何实现

    43 条回复    2015-11-19 17:53:01 +08:00
    sunjourney
        1
    sunjourney  
       2015-11-03 11:57:09 +08:00 via iPhone
    这有点难啊,可能你培训老师会知道
    realpg
        2
    realpg  
       2015-11-03 11:58:15 +08:00
    这个太难了。问一下你的培训机构老师吧。
    rainysia
        3
    rainysia  
       2015-11-03 11:58:26 +08:00
    这有点难啊,可能你培训老师会知道
    rainysia
        4
    rainysia  
       2015-11-03 11:59:09 +08:00
    这有点难啊 ~可能你培训老师会知道
    faceair
        5
    faceair  
       2015-11-03 12:00:34 +08:00
    读文件 根据换行符切分成数组 遍历数组根据输入匹配行 输出行
    jugelizi
        6
    jugelizi  
       2015-11-03 12:02:35 +08:00
    是有点难 楼下会吗
    Neytoph
        7
    Neytoph  
       2015-11-03 12:03:55 +08:00
    等我问问我师父
    zakokun
        8
    zakokun  
       2015-11-03 12:04:59 +08:00
    稍等,我请教下我们公司的 CTO
    wjself
        9
    wjself  
       2015-11-03 12:06:10 +08:00
    233 ,不要這樣嘛…直接 if 語句寫滿要判斷的郵箱不就好了嘛…
    dofy
        10
    dofy  
       2015-11-03 12:14:33 +08:00
    ```php
    <?php
    $txt =
    '张三----2015 年 10 月 2 日 10 时[email protected]
    张三 A----2015 年 10 月 2 日 10 时[email protected]
    李四----2015 年 10 月 2 日 10 时[email protected]
    王五----2015 年 10 月 2 日 10 时[email protected]';

    $email = '[email protected]';
    $newEmail = str_replace('.', '\.', $email);

    $reg = "/.*?\-$newEmail$/m";

    preg_match_all($reg, $txt, $result);

    var_dump($result);
    ?>
    ```
    wkdhf233
        11
    wkdhf233  
       2015-11-03 12:15:05 +08:00
    $mail = '[email protected]';
    $fp = fopen('data.txt', "r");
    while (!feof($fp)) {
    $line = trim(fgets($fp));
    if($mail == split('----', $line)[4]){
    echo $line;
    }
    }
    dofy
        12
    dofy  
       2015-11-03 12:15:10 +08:00
    原来回复不支持 markdown 啊。。。
    solupro
        13
    solupro  
       2015-11-03 12:18:57 +08:00

    其实调用系统命令也是一种选择, awk 不懂就不举例了
    b821025551b
        14
    b821025551b  
       2015-11-03 12:20:04 +08:00
    @solupro 哇这是什么呀看起来好厉害的样子~
    solupro
        15
    solupro  
       2015-11-03 12:24:01 +08:00
    @b821025551b
    有必要这样冷嘲热讽吗?
    7z7
        16
    7z7  
       2015-11-03 12:26:40 +08:00
    分割成为数组,那样就可以取出了。
    Scholer
        18
    Scholer  
       2015-11-03 12:43:44 +08:00
    @solupro 不用先 cat 吧 😂 grep 1234 data.txt 就行了
    solupro
        19
    solupro  
       2015-11-03 12:50:36 +08:00
    @Scholer 命令不熟悉
    aisk
        20
    aisk  
       2015-11-03 13:09:51 +08:00
    @solupro 有啊,今天你告诉他答案明天他还来伸手问。
    LioMore
        21
    LioMore  
       2015-11-03 13:24:34 +08:00
    @b821025551b 有必要这样冷嘲热讽吗?
    myleon
        22
    myleon  
       2015-11-03 13:34:52 +08:00
    转成 csv 大把的类可以让你调用
    SharkIng
        23
    SharkIng  
       2015-11-03 13:38:32 +08:00
    file()
    array()
    if()
    hambut
        24
    hambut  
       2015-11-03 14:16:32 +08:00
    是时候上这个珍藏多年的黑科技了

    @Scholer @solupro @infong @myleon
    hambut
        25
    hambut  
       2015-11-03 14:16:55 +08:00   ❤️ 1
    https://github.com/harelba/q

    日光 at 了忘记写地址了。。。
    jarlyyn
        26
    jarlyyn  
       2015-11-03 14:52:13 +08:00
    csv 或者正则
    tabris17
        27
    tabris17  
       2015-11-03 14:57:01 +08:00
    这道题只有北大青鸟的校长才会做了,太难了
    liujiantao
        28
    liujiantao  
       2015-11-03 15:05:20 +08:00 via iPhone
    fopen 读文件,再分隔字符串
    hongcha
        29
    hongcha  
       2015-11-03 15:39:16 +08:00
    <?php

    echo shell_exec('grep "[email protected]" a.txt');
    moro
        30
    moro  
       2015-11-03 15:46:55 +08:00
    这个问题有一个点需要考虑,就是不能把所有文件全部读入进来,如果这个文件很大的话,内存会爆掉。
    可以用随机读写的函数, fseek,fgets 等

    <?php
    $handle = @fopen("./inputfile.txt", "r");
    $finder = "[email protected]";
    if ($handle) {
    while (($buffer = fgets($handle, 4096)) !== false) {
    if (strpos($buffer, $finder) != false ){
    echo $buffer;
    }
    }
    if (!feof($handle)) {
    echo "Error: unexpected fgets() fail\n";
    }
    fclose($handle);
    }
    codingpp
        31
    codingpp  
       2015-11-03 16:05:41 +08:00
    楼主说的是查询 [email protected] 能得出
    张三----2015 年 10 月 2 日 10 时[email protected]

    大家都打错了
    这题还是有点难度的,还是问培训老师吧
    xfspace
        32
    xfspace  
       2015-11-03 16:12:10 +08:00 via Android
    @codingpp 得问北大青鸟 /蓝翔的校长吧,培训老师还是水
    500miles
        33
    500miles  
       2015-11-03 16:29:36 +08:00
    我天 怎么都这副模样

    人都没说数据大小好么 ... 一个劲的热潮冷讽...

    且不说 3P 了, 就 3T 数据吧 ........
    owlsec
        34
    owlsec  
       2015-11-03 22:58:57 +08:00
    @hambut 哈哈哈你笑死我了
    ryd994
        35
    ryd994  
       2015-11-04 00:16:14 +08:00
    @xfspace
    @tabris17
    我刚问了培训班的老师,老师当场晕过去了怎么办?
    jalen
        36
    jalen  
       2015-11-04 08:51:59 +08:00
    不解, 怎么确定就是培训老师出的题目?
    hongqigong
        37
    hongqigong  
    OP
       2015-11-04 10:17:43 +08:00
    @moro @ solupro @dofy 请问这个代码有什么问题? 如何来写输出的内容?

    <html>
    <head>
    <meta charset="utf-8">
    </head>
    <body>
    <form method="post" action="">
    输入想要搜索的内容:<input type="text" name="content" /></br>
    <input type="submit" value="search" />
    </form>
    </body>
    </html>
    <?php
    $search=$_POST['content'];

    $fh=fopen("text.txt","r");

    while(! feof($fh)) ==true){
    if($str['0']==$search){
    echo $str['1']."</br>";
    }

    }

    fclose($fh);

    ?>
    zjqzxc
        38
    zjqzxc  
       2015-11-04 11:06:34 +08:00
    "PHP 页面输入 [email protected] 此邮箱就能显示张三这条信息,输入其他的则不返回信息"

    楼主的意思明明是:
    if($str=='[email protected]') echo '张三----2015 年 10 月 2 日 10 时[email protected]';
    读文件干嘛。。

    是吧,,“输入其他的则不返回信息”,是这么理解的吧。
    hongqigong
        39
    hongqigong  
    OP
       2015-11-04 11:20:36 +08:00
    @zjqzxc 差不多 是这个意思, TXT 里面内容都是这样的格式 主要是搜索邮箱 出这列的结果 其他的都不出现 ~~~ 现在不知道怎么来写了~~~
    mengzhuo
        40
    mengzhuo  
       2015-11-04 11:24:04 +08:00
    没有索引,没有其他条件的话
    O(N)是跑不了了
    dofy
        41
    dofy  
       2015-11-04 14:21:16 +08:00
    elvba
        42
    elvba  
       2015-11-09 15:04:56 +08:00
    $path = 'tmp.txt';
    $input = '[email protected]';

    if (!file_exists($path)) return;

    $ret = array_filter(file($path), function ($v) use ($input) {return strstr($v, $input) !== false;});
    var_dump($ret);
    inmyfree
        43
    inmyfree  
       2015-11-19 17:53:01 +08:00
    php 的代码我就不给了,给了一个 shell 的结合 cat,grep ,和正则查找的,php 逻辑是一样的,有兴趣的可以看看

    https://github.com/inmyfree/gits/blob/master/grep_php.md
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   923 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 21:50 · PVG 05:50 · LAX 13:50 · JFK 16:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.