【问题标题】:Remove content line breaks tsv删除内容换行符 tsv
【发布时间】:2014-06-12 04:37:40
【问题描述】:

我正在尝试清理 TSV 文件(从 excel 电子表格复制)以读入 PHP。

我需要做的是从 TSV 的内容部分删除任何换行符,但不是每行末尾的换行符,知道如何通过使用正则表达式或其他函数来完成。

示例数据(我已突出显示选项卡):

[tab]Some tab seperated data[tab]"
Here is some text that someone has used alt+enter to insert a new line into
• One.
• Two
• Three
"[tab][tab][tab][tab]Some data[tab][tab]Some other data[final-line-break]

编辑:经过进一步调查,如果 excel 在实际单元格值中遇到“,它会将其分隔为“”,这将导致下面的正则表达式出现问题,还有其他人有解决方案吗?

【问题讨论】:

  • 也就是说,要去掉双引号之间的换行符吗?
  • 是的 - 这是一种更简单的表达方式!
  • 我们能在引用的内容之外找到转义的引号""吗?
  • 如果单元格有双引号但没有换行,双引号不会被转义。如果单元格有双引号和新行,则整个单元格将用双引号括起来,并且双引号将被转义。
  • 好的,现在更清楚了。我会为此更新我的模式。最后一件事,一行的第一个单元格是否由制表符在左侧分隔? (或者什么都没有?)

标签: php regex excel tsv


【解决方案1】:

我的解决方法:

/\n(.+\n[^\t])+.+/

使用上面的模式,您可以准确地抓取您提到的引号之间的字符串。

从这里您可以使用 preg 匹配和模式来获取引号之间的字符串。然后根据需要使用 pre_replace 替换新行。

preg_replace("/\n/", "", $match);

【讨论】:

    【解决方案2】:

    主要的困难是区分开引号和闭引号。

    你可以使用这个替换(我放了一个#作为替换字符串只是为了看看,你显然可以使用你想要的,一个空格,一个空字符串......)

    $pattern = <<<'EOD'
    ~
    (?:            # entry points:
        (?!\A)\G   #   - contiguous to a precedent match
      |            #   OR
        (?:^|\t)"  #"# - quote preceded by a start of line or a tab 
    )
    
    (?>
        [^\r\n"\t]+ #"# all execpt tabs, newlines and quotes
      |
        ""          # escaped quote
    )*
    \K              # remove all on the left from match result
    (?:
        \R          # newline
      |
        "(*SKIP)(?!) #"# closing quote (skipped)
    )
    ~xm
    EOD;
    
    $data = preg_replace($pattern, '#', $data);
    

    比赛只能从两个入口点之一开始。第一场比赛使用开场引号,下一场比赛使用(?!\A)\G 入口点。 \G 是先例匹配结束的锚点,但由于它也可以匹配字符串的开头,所以我添加了(?!\A) 这意味着 后面没有字符串的开头以避免这种可能性。

    \K 会从匹配结果中删除之前匹配的所有内容。有了这个技巧,左边的任何东西都不会被替换。

    \R 代表换行符,与操作系统无关(但是,我认为在您的情况下它可能是 \r\n)。

    " 将匹配结束引号。但是由于您不想替换它,所以我强制模式以(?!) 失败(后面没有任何内容)

    (*SKIP) 回溯控制动词禁止重试之前匹配的字符以防失败。这非常有用,因为没有它,结束引号可以在下一次迭代中被模式视为新的开始引号。这样,正则表达式引擎将仅在结束报价之后继续搜索。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-12
      • 1970-01-01
      相关资源
      最近更新 更多