dops57958 2012-05-25 15:16 采纳率: 0%
浏览 26
已采纳

正则表达式提取

I've been trying to extract something inside a string. I got the follwing string :

*, bob, DATE('gdfgfd', 'Fdsfds', ('fdsfdfsd')), george

I want to extract by commas outside () and it is suppose to give this :

  • *
  • bob
  • DATE('gdfgfd', 'Fdsfds', ('fdsfdfsd'))
  • george

I've been trying to use explode but it cut even inside ( and ) ... logic by the function mean.

So I've did this : [^(,\s]+|\([^)]+\) but it give cut even if a commas is found inside bracket.

Anyone know how to do what i mean ?

Thanks

EDIT :

Ok to be very clear and direct.

I got this : SELECT MyField, Field2, Blabla, Function(param), etc FROM table Blabla

I got the string MyField, Field2, Blabla, Function(param), etc already because the query is done by multiple function class like $DB->Select('MyField, Field2, Blabla, Function(param), etc'); but now I want to parse everything between commas so MyField, Field2, Blabla, Function(param), etc become this :

  • MyField
  • Field2
  • Blabla
  • Function(param)
  • etc
  • 写回答

6条回答 默认 最新

  • douxiong3234 2012-05-25 15:55
    关注

    Here's what I cooked up, doesn't support multibyte characters:

    Edit: added string awareness

    <?php
    
    
    $stack = array();
    $stuff = array();
    
    $escaping = false;
    $input = "*, bob, [], DATE('g()d\\'f,gfd', ('Fd()sf)ds'), ('fdsfd\"\"()fsd')), ',(),() (,,'";
    $len = strlen( $input );
    $i = 0;
    $curstr = "";
    $char;
    
    while( $i < $len ) {
        $char = $input[$i++];
    
        if( $escaping ) {
            $curstr .= $char;
            $escaping = false;
            continue;
        }
    
        switch( $char ) {
    
            case "\\":
                $escaping = true;
                break;
    
            case '"':
                $top = end( $stack );
                if( $top === '"' ) {
                    array_pop( $stack );
                }
                else if( $top !== "'" ){
                    $stack[] = '"';
                }
    
                $curstr .= $char;
                break;
    
            case "'":
                $top = end( $stack );
                if( $top === "'" ) {
                    array_pop( $stack );
                }
                else if( $top !== '"' ) {
                    $stack[] = "'";
                }
    
                $curstr .= $char;           
                break;
    
            case ",":
                if( count( $stack ) ) {
                    $curstr .= $char;
                }
                else {
                    $stuff[] = trim($curstr);
                    $curstr = "";
                }
                break;
    
            case "(":
                $top = end( $stack );
                if( $top !== "'" && $top !== '"' ) {
                    $stack[] = "(";                   
                }
    
                $curstr .= $char;
                break;
    
            case ")":
                $top = end( $stack );
    
                if( $top !== "'" && $top !== '"' ) {
                    if( end($stack) !== "(" ) {
                        die( "Unbalanced parentheses" );
                    }
                    array_pop( $stack );
                }
    
                $curstr .= $char;
    
    
                break;
    
            default:
                $curstr .= $char;
                break;
    
        }
    }
    
    if( count( $stack ) ) {
        die( "Unbalanced ".end($stack) );
    }
    
    $stuff[] = trim( $curstr );
    
    print_r( $stuff );
    
    /*
        Array
    (
        [0] => *
        [1] => bob
        [2] => []
        [3] => DATE('g()d'f,gfd', ('Fd()sf)ds'), ('fdsfd""()fsd'))
        [4] => ',(),() (,,'
    )
    
    */
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

悬赏问题

  • ¥15 孟德尔随机化结果不一致
  • ¥20 求用stm32f103c6t6在lcd1206上显示Door is open和password:
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法