拆分字符串,不包括某些字符


Split a string, excluding some characters

可能的重复项:
按分隔符拆分字符串,但如果转义则不拆分

我有一个从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));
    }
}

谁能帮我做到这一点?

这样做:

<?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));
您可以使用

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

print_r(preg_split('/(?<![''''])'|/', 'This'|is a|test|string'));
将 backslah + pipesign 替换为占位符,

然后通过管道符号爆炸,然后将背面占位符替换为 backslah + pipesign