【发布时间】:2014-11-04 15:20:45
【问题描述】:
这是我要运行的代码:
$str = 'a,b,c,d';
return preg_split('/(?<![^\\\\][\\\\]),/', $str);
如您所见,这里使用的正则表达式是:
/(?<![^\\][\\]),/
这是一个简单的固定长度的负向回溯,用于“前面是不是反斜杠的东西,然后是反斜杠!”。
这个正则表达式在http://www.phpliveregex.com上工作得很好
但是当我去实际尝试运行上述代码时,我会吐回错误:
Warning: preg_split() [function.preg-split]: Compilation failed: lookbehind assertion is not fixed length at offset 13
更糟糕的是,一位程序员同事在他的 5.4.24 PHP 服务器上测试了代码,并且运行良好。
这让我相信我的问题与我几乎无法控制的服务器配置有关。我被告知我的 PHP 版本是 5.2.*
对于 preg_replace() 是否有任何可能不存在此问题的解决方法/替代方法?
【问题讨论】:
-
当运行代码确实可以正常工作并拆分结果。
-
可能不是真正的 5.2。它对我有用,您可以查看它在哪些版本中失败here(在 4.3.0 - 4.4.4、5.0.0 - 5.1.6 中失败)。请注意,您运行的是 ancient PHP 版本。
-
您可以使用
'/(?<!(?<!\\\\)\\\\),/',在所有版本中都成功(注意:修复了此评论之前版本中的逻辑错误)。 -
但是,这是否会按预期拆分字符串
a\\\,b? (或:'a\\\\\\,b'带转义引号)。 -
FWIW:我更喜欢匹配而不是拆分以获得独立于其中 \ 数量的可靠行为:
preg_match_all('/(?:[^\\\\,]|\\\\.)+/u',$str,$matches);(旧的 '不是转义符或分隔符,或直接转义后面跟着你喜欢的任何东西 - 序列')