可能的重复项:
按分隔符拆分字符串,但如果转义则不拆分
我有一个从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