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

PHP 用正则表达式怎样实现这个功能?

  •  
  •   yumijie · 2016-01-05 20:11:06 +08:00 · 3239 次点击
    这是一个创建于 3279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个文本文件 file.txt
    内容是每行四个字符:
    fdsa
    vffd
    csfe
    zfvs
    gfge
    fdsk
    dcfa
    zdco
    fdau
    dpkl
    fpyt

    这样的结构,有几十万行。我想把他们分类,带 aeoiu 任一个字符或者多个元音字符的写在
    one.txt 文件中,不带 aeoiu 中的任何一个字符放在文件 two.txt 中,代码写了好久,不会做啊,正则完全不懂.有高手指教下吧。又做了伸手党,可耻啊!!!

    32 条回复    2016-01-11 20:38:50 +08:00
    lxrmido
        1
    lxrmido  
       2016-01-05 20:27:18 +08:00
    preg_match('/[aeoiu]/', $word);
    Zzzzzzzzz
        2
    Zzzzzzzzz  
       2016-01-05 20:30:06 +08:00   ❤️ 2
    用 strpbrk
    bdbai
        3
    bdbai  
       2016-01-05 20:32:25 +08:00 via iPhone
    正则表达式存文件好像挺难的,找个培训班老师问问吧。
    liuhaotian
        4
    liuhaotian  
       2016-01-05 20:34:54 +08:00
    preg_match_all('/([aeiou]+)/',$word);
    foreach($word as $theword){
    //output
    }
    preg_match_all('/(^[aeiou]+)/',$word);
    foreach($word as $theword){
    //output
    }
    好像是这样的吧
    liuhaotian
        5
    liuhaotian  
       2016-01-05 20:35:42 +08:00
    错了。。
    preg_match_all('/([aeiou]+)/',$word,$matches);
    foreach($matches as $theword){
    //output
    }
    preg_match_all('/(^[aeiou]+)/',$word);
    foreach($matches as $theword){
    //output
    }
    好像是这样的吧
    yumijie
        6
    yumijie  
    OP
       2016-01-05 20:41:56 +08:00
    @Zzzzzzzzz

    @liuhaotian

    @lxrmido
    非常感谢楼上几位,我去试试.......
    cnxh
        7
    cnxh  
       2016-01-05 20:43:51 +08:00 via iPhone
    是域名吗
    yumijie
        8
    yumijie  
    OP
       2016-01-05 20:43:55 +08:00
    @bdbai 感谢,身边没有懂程序的朋友,只好来网上找
    yumijie
        9
    yumijie  
    OP
       2016-01-05 20:44:54 +08:00
    @cnxh 对的,我想筛选域名
    jfcherng
        10
    jfcherng  
       2016-01-05 20:48:46 +08:00   ❤️ 1
    $file = file_get_contents('file.txt', 'r');

    $one = $two = [];
    $lines = explode("\n", $file);
    foreach ($lines as &$line) {
    if (preg_match('/[aeiou]/S', $line)) {
    // if (strpbrk($line, 'aeiou') !== false) {
    // if (strcspn($line, 'aeiou') < strlen($line)) {
    $one[] = &$line;
    } else {
    $two[] = &$line;
    }
    }
    $one = implode("\n", $one);
    $two = implode("\n", $two);

    file_put_contents('one.txt', $one);
    file_put_contents('two.txt', $two);
    ChiChou
        11
    ChiChou  
       2016-01-05 20:49:55 +08:00
    grep '[aeiou]' file.txt > one.txt
    grep -v '[aeiou]' file.txt > two.txt
    yumijie
        12
    yumijie  
    OP
       2016-01-05 21:04:11 +08:00
    @jfcherng 非常感谢,尝试了下,可以用。
    yumijie
        13
    yumijie  
    OP
       2016-01-05 21:04:55 +08:00
    @ChiChou 感谢回复,你这个实在 linux 下使用吗?
    yumijie
        14
    yumijie  
    OP
       2016-01-05 21:06:39 +08:00
    @jfcherng

    $one = $two = []; 这句什么意思?创建数组吗?
    jfcherng
        15
    jfcherng  
       2016-01-05 21:08:58 +08:00   ❤️ 1
    @yumijie http://php.net/manual/en/migration54.new-features.php
    PHP 5.4 之後可以用 [...] 替代 array(...)
    movtoy
        16
    movtoy  
       2016-01-05 21:17:33 +08:00
    不会正则,笨办法。不知道能不能用

    $fh = fopen('filename.txt', r) or die('errormsg');
    while(! feof($fh)) { //判断是否文件末尾
    $string = fgets($fh);//得到一行
    //处理该行
    for ($i=0; $i <strlen($string); $i++) {
    if (strpos('aeiouAEIOU',$string[$i]) === false) {
    # 写入 two.txt
    } else {
    # 写入 one.txt
    }
    }
    }
    fclose($fh);
    KentY
        17
    KentY  
       2016-01-05 21:48:38 +08:00   ❤️ 1
    awk 很容易啊

    awk '{print > (($0~/[aeiou])?"one":"two")".txt"}' file

    没测试, 估计差不多.
    KentY
        18
    KentY  
       2016-01-05 21:49:15 +08:00
    差个 /, :
    /[aeiou]/
    ChiChou
        19
    ChiChou  
       2016-01-05 22:26:11 +08:00   ❤️ 1
    @yumijie Linux 和 Mac 都可以。如果是 Windows 的话,可以装个 babun
    elvba
        20
    elvba  
       2016-01-06 01:18:49 +08:00
    array_map(function ($line) {
    file_put_contents(( strpbrk($line, 'aeiou') !== false ) ? 'one.txt' : 'two.txt', $line, FILE_APPEND);
    }, file('file.txt'));
    chaegumi
        21
    chaegumi  
       2016-01-06 07:49:31 +08:00
    搞了几年的 php 了,我都不知道有这个函数: strpbrk
    yumijie
        22
    yumijie  
    OP
       2016-01-06 08:24:26 +08:00
    @jfcherng 哦好的,我猜对了,呵呵
    yumijie
        23
    yumijie  
    OP
       2016-01-06 08:25:16 +08:00
    @ChiChou 恩,这个方法非常好,可以在 crontab 下运行,省的不少事情
    yumijie
        24
    yumijie  
    OP
       2016-01-06 08:25:37 +08:00
    @KentY 谢谢
    yumijie
        25
    yumijie  
    OP
       2016-01-06 08:26:15 +08:00
    非常感谢楼上诸位,我就不一一 @
    yumijie
        26
    yumijie  
    OP
       2016-01-06 08:27:34 +08:00
    楼上好几位的代码都能实现我想要的功能,我在查查手册,消化消化。
    xiamingchong
        27
    xiamingchong  
       2016-01-06 09:38:28 +08:00
    其实不用 php ,两个命令就好了

    awk '/[aeiou]+/ {print }' file.txt > one.txt
    awk '/^[^aeiou]+$/ {print }' file.txt > two.txt
    flydogs
        28
    flydogs  
       2016-01-06 10:19:04 +08:00
    直接用文本编辑器,正则规范 分别检索两次
    不用写 php 程序把。
    minongbang
        29
    minongbang  
       2016-01-06 18:20:30 +08:00
    我很早以前就写了个这样的工具。。

    @yumijie
    yumijie
        30
    yumijie  
    OP
       2016-01-07 09:49:54 +08:00
    @minongbang 哦我在网上找了好久没找到这样的工具.
    KIDJourney
        31
    KIDJourney  
       2016-01-10 21:11:36 +08:00   ❤️ 1
    yumijie
        32
    yumijie  
    OP
       2016-01-11 20:38:50 +08:00
    @KIDJourney 可惜我看不懂 python
    PHP 我都只能看点皮毛
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2478 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 15:34 · PVG 23:34 · LAX 07:34 · JFK 10:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.