代码之家  ›  专栏  ›  技术社区  ›  Ryan Florence

如何在文件中的“”中查找\n

  •  0
  • Ryan Florence  · 技术社区  · 15 年前

    我从来没有在PHP(或任何语言)中对文本进行过太多解析。我有这篇文章:

    1 (2) ,Yes,5823,"Some Name
    801-555-5555",EXEC,,"Mar 16, 2009",0.00,
    1 (3) ,,4821,Somebody Else,MBR,,"Mar 11, 2009",,0.00
    2 (1) ,,5634,Another Guy,ASSOC,,"Mar 15, 2009",,0.00
    

    你可以看到第一行有一个中断,我需要得到它:

    1 (2) ,Yes,5823,"Some Name 801-555-5555",EXEC,,"Mar 16, 2009",0.00,
    1 (3) ,,4821,Somebody Else,MBR,,"Mar 11, 2009",,0.00
    2 (1) ,,5634,Another Guy,ASSOC,,"Mar 15, 2009",,0.00
    

    我正在考虑使用正则表达式来查找 \n preg_replace() . 我目前正在研究正则表达式,因为我对它一无所知,所以我可以自己解决这个问题(这总是最好的),但毫无疑问,解决我当前的问题将帮助我更快地处理它。

    非常感谢。如果可以的话,我会立即悬赏。

    谢谢

    2 回复  |  直到 15 年前
        1
  •  3
  •   fortran    15 年前

    如果文本的格式是固定的,也许你根本不需要正则表达式,只需扫描行中的两个双引号,如果只有一个双引号,开始连接行,直到找到结束的一行。。。

    如果可以使用转义引号、单引号来分隔字符串等,可能会出现问题。但只要不存在这种情况,就可以了。

    我不懂PHP,所以这里有一些伪代码:

    open = False
    for line in lines do
        nquotes = line.count("\"")
        if not open then
            if nquotes == 1 then
                open = True
                write(line)
            else #we assume nquotes == 2
                writeln(line)
            end
        else
            if nquotes == 0 then
                write(line)
            else #we assume nquotes == 1
                open = False
                writeln(line)
            end
        end
     end
    
        2
  •  1
  •   Peter Bailey    15 年前

    下面是fortran在PHP中的基本答案

    <pre>
    <?php
    
    $data = <<<DATA
    1 (2) ,Yes,5823,"Some Name
    801-555-5555",EXEC,,"Mar 16, 2009",0.00,
    1 (3) ,,4821,Somebody Else,MBR,,"Mar 11, 2009",,0.00
    2 (1) ,,5634,Another Guy,ASSOC,,"Mar 15, 2009",,0.00
    DATA;
    
    echo $data, '<hr>';
    
    $lines = preg_split( "/\r\n?|\n/", $data );
    
    $filtered = "";
    $open = false;
    foreach ( $lines as $line )
    {
    
      if ( substr_count( $line, '"' ) & 1 && !$open )
      {
        $filtered .= $line;
        $open = true;
      } else {
        $filtered .= $line . "\n";
        $open = false;
      }
    }
    
    echo $filtered;
    ?>
    </pre>