我有一个从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));
}
}
任何人都可以帮我这么做吗?
答案 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替换回占位符