preg_replace跳过与模式不匹配的行的输出


preg_replace skip output for lines that don't match the pattern

我有一个CSV文件,我想使用PHP解析(不想使用php csv函数,因为它们对我的情况来说太慢了)。我使用 preg_replace 只选择我需要的列并将输出写回标准输出。我有一个看起来像这样的模式

preg_replace("/^'"([^'"]*)'",'"([^'"]*)'"(.*)$/m", "$1;$2", $content);

CSV 中有一些行格式不正确。有没有办法跳过与上述模式不匹配的行的输出?

你可以分两步完成:

首先删除所有与您的正则表达式不匹配的行:

preg_replace("/^(?!'"([^'"]*)'",'"([^'"]*)'".*$).*'r?'n/m", "", $content);

然后执行原始正则表达式替换。

但是,您需要非常小心。一旦您在 CSV 字段中获得换行符和/或转义引号,这些正则表达式可能会中断并销毁您的文件。

或者想象一条畸形的线,例如

"foo","bar (missing quote!)
"baz", "bam" (correct line)

正则表达式现在将删除不完整的行和正确的行,因为[^'"]*也会吃换行符。