PHP 用正则表达式怎样实现这个功能? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yumijie
V2EX    PHP

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

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

    我有一个文本文件 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     Solana     2586 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 39ms UTC 11:19 PVG 19:19 LAX 04:19 JFK 07:19
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86