如何用不在数字之间的斜线分割字符串?

How to split string by slash which is not between numbers?

如何用不在数字之间的斜线分割字符串? 我正在使用下面的 preg_split 函数:

$splitted = preg_split('#[/\\\_\s]+#u', $string);

输入:"925/123 Black/Jack"

现在拆分结果:

[
    0 => '925',
    1 => '123',
    2 => 'Black',
    3 => 'Jack'
]

我要的拆分结果:

[
    0 => '925/123',
    1 => 'Black',
    2 => 'Jack'
]

一个选项是匹配 1 个或多个数字除以正斜杠,在左侧和右侧有空白边界。

然后使用SKIP FAIL,匹配字符class中列出的1次或多次。请注意,您不必转义下划线。

(?<!\S)\d+(?:/\d+)+(?!\S)(*SKIP)(*F)|[/\_\s]+

说明

  • (?<!\S)\d+(?:/\d+)+(?!\S) 匹配正斜杠之间的重复数字
  • (*SKIP)(*F) 跳过
  • |
  • [/\_\s]+ 匹配任何列出的 1+ 次

Regex demo | Php demo

例如

$string = "925/123 Black/Jack";
$pattern = "#(?<!\S)\d+(?:/\d+)+(?!\S)(*SKIP)(*F)|[/\\_\s]+#u";
$splitted = preg_split($pattern, $string);
print_r($splitted);

输出

Array
(
    [0] => 925/123
    [1] => Black
    [2] => Jack
)

您可以使用

preg_split('#(?:[\s\\_]|(?<!\d)/(?!\d))+#u', '925/123 Black/Jack')

查看 PHP demo and the regex demo 和正则表达式图:

详情

  • (?: - 非捕获组的开始:
    • [\s\_] - 空格,\_
    • | - 或
    • (?<!\d)/(?!\d) - / 未包含数字
  • )+ - 非捕获组结束,重复 1 次或多次。

您的正则表达式不必要地复杂。您需要将字符串拆分为:

  • 要么是 space(也许更普遍 - 一系列白色字符),
  • 斜线
    • 前面没有数字(负后视),
    • 后面没有数字(负先行)。

所以您需要的正则表达式(包含在 # 个字符中,带有双反斜杠)是:

#(?<!\d)/(?!\d)|\s+#

代码示例:

$string = "925/123 Black/Jack";
$pattern = "#(?<!\d)/(?!\d)|\s+#";
$splitted = preg_split($pattern, $string);
print_r($splitted);

打印你想要的:

Array
(
    [0] => 925/123
    [1] => Black
    [2] => Jack
)