php preg_split 忽略重复的分隔符

标签 php regex

我想分割由我们只能使用的旧版本 phpstan (v0.9) 生成的字符串。

每个错误字符串都由 : 分隔,但有时会出现用 :: 标记的静态调用,我想忽略它们。

我的代码:

$error = '/path/to/file/namespace/filename:line_number:error message Namespace\ClassName::method().'
$output = preg_split('/:/', $error);

$outputvar_dump 给出:

Array
(
    [0] => /path/to/file/namespace/filename
    [1] => line_number
    [2] => error message Namespace\ClassName
    [3] => 
    [4] => method().
)

我想要的结果是这样的:

Array
(
    [0] => /path/to/file/namespace/filename
    [1] => line_number
    [2] => error message Namespace\ClassName::method().
)

我希望可以用正则表达式解决这个问题。

我一直在阅读类似的问题,并尝试过正则表达式的变体,但没有一个有效。

最佳答案

您可以使用前视和后视进行分割:

$error = '/path/to/file/namespace/filename:line_number:error message Namespace\ClassName::method().';
$arr = preg_split('/(?<!:):(?!:)/', $error, -1, PREG_SPLIT_NO_EMPTY);
print_r($arr);
Array
(
    [0] => /path/to/file/namespace/filename
    [1] => line_number
    [2] => error message Namespace\ClassName::method().
)

RegEx Demo

正则表达式详细信息:

  • (?<!:) :如果存在:,则负向后查找会使匹配失败后面
  • : :匹配:
  • (?!:) :如果存在:,则负向预测会使匹配失败领先

关于php preg_split 忽略重复的分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60579827/

相关文章:

php - 如何加密 url 和解密以访问被拒绝访问的内容?

php - 在 Paypal 中存储客户数据

css - Apache2 重写规则导致错误

regex - 使用 RewriteRule 从重定向中删除主题标签

php - 单独行中的mysql行

php - WordPress 插件模板覆盖 - 作品集

php - 回复电子邮件以发表评论

javascript - 在 JavaScript 中将长正则表达式分成几行

mysql - 在 MySQL 中使用 RegEx 更新复杂的 SQL 表

c# - 动态构建的正则表达式运行速度极慢!