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

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

  •  
  •   yumijie · 2016 年 1 月 5 日 · 3630 次点击
    这是一个创建于 3666 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个文本文件 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 年 1 月 5 日
    preg_match('/[aeoiu]/', $word);
    Zzzzzzzzz
        2
    Zzzzzzzzz  
       2016 年 1 月 5 日   ❤️ 2
    用 strpbrk
    bdbai
        3
    bdbai  
       2016 年 1 月 5 日 via iPhone
    正则表达式存文件好像挺难的,找个培训班老师问问吧。
    liuhaotian
        4
    liuhaotian  
       2016 年 1 月 5 日
    preg_match_all('/([aeiou]+)/',$word);
    foreach($word as $theword){
    //output
    }
    preg_match_all('/(^[aeiou]+)/',$word);
    foreach($word as $theword){
    //output
    }
    好像是这样的吧
    liuhaotian
        5
    liuhaotian  
       2016 年 1 月 5 日
    错了。。
    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 年 1 月 5 日
    @Zzzzzzzzz

    @liuhaotian

    @lxrmido
    非常感谢楼上几位,我去试试.......
    cnxh
        7
    cnxh  
       2016 年 1 月 5 日 via iPhone
    是域名吗
    yumijie
        8
    yumijie  
    OP
       2016 年 1 月 5 日
    @bdbai 感谢,身边没有懂程序的朋友,只好来网上找
    yumijie
        9
    yumijie  
    OP
       2016 年 1 月 5 日
    @cnxh 对的,我想筛选域名
    jfcherng
        10
    jfcherng  
       2016 年 1 月 5 日   ❤️ 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 年 1 月 5 日
    grep '[aeiou]' file.txt > one.txt
    grep -v '[aeiou]' file.txt > two.txt
    yumijie
        12
    yumijie  
    OP
       2016 年 1 月 5 日
    @jfcherng 非常感谢,尝试了下,可以用。
    yumijie
        13
    yumijie  
    OP
       2016 年 1 月 5 日
    @ChiChou 感谢回复,你这个实在 linux 下使用吗?
    yumijie
        14
    yumijie  
    OP
       2016 年 1 月 5 日
    @jfcherng

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

    $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 年 1 月 5 日   ❤️ 1
    awk 很容易啊

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

    没测试, 估计差不多.
    KentY
        18
    KentY  
       2016 年 1 月 5 日
    差个 /, :
    /[aeiou]/
    ChiChou
        19
    ChiChou  
       2016 年 1 月 5 日   ❤️ 1
    @yumijie Linux 和 Mac 都可以。如果是 Windows 的话,可以装个 babun
    elvba
        20
    elvba  
       2016 年 1 月 6 日
    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 年 1 月 6 日
    搞了几年的 php 了,我都不知道有这个函数: strpbrk
    yumijie
        22
    yumijie  
    OP
       2016 年 1 月 6 日
    @jfcherng 哦好的,我猜对了,呵呵
    yumijie
        23
    yumijie  
    OP
       2016 年 1 月 6 日
    @ChiChou 恩,这个方法非常好,可以在 crontab 下运行,省的不少事情
    yumijie
        24
    yumijie  
    OP
       2016 年 1 月 6 日
    @KentY 谢谢
    yumijie
        25
    yumijie  
    OP
       2016 年 1 月 6 日
    非常感谢楼上诸位,我就不一一 @
    yumijie
        26
    yumijie  
    OP
       2016 年 1 月 6 日
    楼上好几位的代码都能实现我想要的功能,我在查查手册,消化消化。
    xiamingchong
        27
    xiamingchong  
       2016 年 1 月 6 日
    其实不用 php ,两个命令就好了

    awk '/[aeiou]+/ {print }' file.txt > one.txt
    awk '/^[^aeiou]+$/ {print }' file.txt > two.txt
    flydogs
        28
    flydogs  
       2016 年 1 月 6 日
    直接用文本编辑器,正则规范 分别检索两次
    不用写 php 程序把。
    minongbang
        29
    minongbang  
       2016 年 1 月 6 日
    我很早以前就写了个这样的工具。。

    @yumijie
    yumijie
        30
    yumijie  
    OP
       2016 年 1 月 7 日
    @minongbang 哦我在网上找了好久没找到这样的工具.
    KIDJourney
        31
    KIDJourney  
       2016 年 1 月 10 日   ❤️ 1
    yumijie
        32
    yumijie  
    OP
       2016 年 1 月 11 日
    @KIDJourney 可惜我看不懂 python
    PHP 我都只能看点皮毛
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   5867 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 06:42 · PVG 14:42 · LAX 22:42 · JFK 01:42
    ♥ Do have faith in what you're doing.