【问题标题】:Split a string, excluding some characters [duplicate]拆分字符串,不包括某些字符[重复]
【发布时间】:2012-01-26 03:15:30
【问题描述】:

可能重复:
Split string by delimiter, but not if it is escaped

我有一个从 ibm informix 数据库生成的字符串,它由管道 | 字符分隔,并且存在一些数据错误,这意味着数据中有 反斜杠 + 管道。我只想从管道符号中拆分这些字符串,而不是从 反斜杠 + 管道 \| 或其他带有管道的符号中拆分。

这是我的代码,但它只适用于管道字符:

foreach(glob("ssbstat.unl") as $file)
{ 
    $c=0;       
    if(($load = fopen($file, "r")) !== false)
    { 
        $line = fgets($load);           
        $count= count(explode('|', $line));
        echo $fm= str_repeat('%[^|]|', $count)."%s\n";      

        do
        {
            echo $line;
            print_r($line);
            if($c++>10) break;
        } while ($line = fscanf($load, $fm));
    }
}

谁能帮我做这个?

【问题讨论】:

  • PHP4?是时候升级了...
  • 您需要排除哪些“其他字符”,“或其他带有管道的标志”是什么意思? \| 是您想要忽略的唯一项吗?

标签: php php4


【解决方案1】:

这样做:

<?php
$line = preg_replace("/([^\\\])\|/", "$1 |", "Hi \|error\| man|ok man|perfect man");
print_r(preg_split('/[^\\\]\|/', $line));

将输出:

Array ( [0] => "Hi \|error\| man" [1] => "ok man" [2] => "perfect man" )

测试!

编辑:就像 Maerlyn 说的,这也是可能的:

<?php
$line = "Hi \|error\| man|ok man|perfect man";
print_r(preg_split('~\\\\.(*SKIP)(*FAIL)|\|~s', $line));

【讨论】:

    【解决方案2】:

    您可以使用preg_split 执行此操作。这篇[^\\\\] 指定应该忽略带有反斜杠的管道(正确转义需要四个反斜杠。您可以在[] 中添加任何其他要忽略的字符。

    print_r(preg_split('/(?<![\\\\])\|/', 'This\|is a|test|string'));
    

    【讨论】:

    • 这行不通!像'This\|is a|test|string' 这样的字符串将返回:Array ( [0] =&gt; "This\|is " [1] =&gt; "tes" [2] =&gt; "string" ) 因为你说| 之前的任何字符不是反斜杠也将成为拆分函数的一部分,所以它消失了。这就是为什么你应该在之前使用 preg_replace (就像我已经回答的那样)
    • 好收获。我真的应该使用负面的后视。 preg_replace 不是必需的。答案已更新。
    【解决方案3】:

    将 backslah + pipesign 替换为占位符,然后通过 pipesign 展开,然后将 back placeholder 替换为 backslah + pipesign

    【讨论】:

    • 您建议使用哪种占位符?它必须是不可能出现在数据中的东西,否则您最后的替换可能会损坏它。
    • 字符串中不太可能出现的任何内容。像“{[%my_great_placeholder%]}”这样的东西
    • 我已经完成了,但是大约有 100000 行。这需要很长时间。我想要一个简短的方法。这个正则表达式可以开发吗???
    • @MassimilianoArione:它可能会奏效,但“可能”是阻碍它成为一个好主意的原因;一种您实际上会感到安全的产品。除非您可以 100% 确定数据包含(或不包含)什么,否则没有可能的占位符可以安全使用。正则表达式是这种事情的解决方案。
    • regexp 并不比简单的 str_replace 快,实际上它更慢。
    猜你喜欢
    • 2019-08-29
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-22
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2016-01-19
    相关资源
    最近更新 更多