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

时间:2011-12-22 13:31:04

标签: php php4

  

可能重复:
  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));
    }
}

任何人都可以帮我这么做吗?

3 个答案:

答案 0 :(得分:3)

这样做:

<?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" )

<强> Testet!

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

用占位符替换反斜杠+管道符号,然后通过pipesign展开,然后用反斜杠+ pipesign替换回占位符