Php preg_split:根据非常特定的模式拆分字符串

Php preg_split:根据非常特定的模式拆分字符串,php,regex,preg-split,Php,Regex,Preg Split,这里是Regex/phpn00b。我正在尝试使用PHP“preg_split”函数 我有一个字符串,它遵循一个非常特殊的模式,我想根据这个模式分割它们 字符串的示例: 卡达夫[电影](加拿大:魁北克,埃里克·卡努尔,2009年,长篇悲剧)小说 预期结果: 分隔符(按出现顺序): 如何正确地编写正则表达式 以下是我尝试过的: <?php $pattern = "/\s\[/\]\s\(/,\s/,\s/,\s/\)\s/"; $string = "CADAVRES [FILM] (Canad

这里是Regex/phpn00b。我正在尝试使用PHP“preg_split”函数

我有一个字符串,它遵循一个非常特殊的模式,我想根据这个模式分割它们

字符串的示例:

卡达夫[电影](加拿大:魁北克,埃里克·卡努尔,2009年,长篇悲剧)小说

预期结果:

分隔符(按出现顺序):

如何正确地编写正则表达式

以下是我尝试过的:

<?php
$pattern = "/\s\[/\]\s\(/,\s/,\s/,\s/\)\s/";
$string = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
$keywords = preg_split($pattern, $string);
print_r($keywords);

我用
preg\u match\u all
找到了一个解决方案:

$input = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
preg_match_all("|[^-\\[\\](),/\\s]+(?:(?: :)? [^-\\[\\](),/]+)?|", $input, $matches);
print_r($matches[0]);

Array
(
    [0] => CADAVRES
    [1] => FILM
    [2] => Canada : Québec
    [3] => Érik Canuel
    [4] => 2009
    [5] => long métrage
    [6] => FICTION
)

上述正则表达式将一个词视为不象括号、逗号、括号等的任何字符。它也允许两个词项,可能在中间有冒号分隔符。

这里有一个尝试:<代码> PrggMatals >:

$pattern = "/^([^\[]+)\[([^\]]+)\]\s+\(([^,]+),\s+([^,]+),\s+([^,]+),\s+([^,]+)\)\s+(.+)$/i";
$string = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
preg_match($pattern, $string, $keywords);
array_shift($keywords);
print_r($keywords);
输出:

Array
(
    [0] => CADAVRES 
    [1] => FILM
    [2] => Canada : Québec
    [3] => Érik Canuel
    [4] => 2009
    [5] => long métrage
    [6] => FICTION
)
数组
(
[0]=>CADAVRES
[1] =>胶片
[2] =>加拿大:魁北克省
[3] =>埃里克·卡努埃尔
[4] => 2009
[5] =>长梅悲剧
[6] =>小说
)

正则表达式细分:

^   anchor to start of string
 (    begin capture group 1
  [^\[]+   one or more non-left bracket characters
        )   end capture group 1
         \[   literal left bracket
           (   begin capture group 2
            [^\]]+   one or more non-right bracket characters
                  )    end capture group 2
                   \]   literal bracket
                     \s+    one or more spaces
                        \(    literal open parenthesis
                          (     open capture group 3
                           [^,]+   one or more non-comma characters
                                )     end capture group 3
                                 ,\s+     literal comma followed by one or more spaces
                                     ([^,]+),\s+([^,]+),\s+([^,]+)   repeats of the above
                                                                  \)   literal closing parenthesis
                                                                    \s+   one or more spaces
                                                                       (  begin capture group 7
                                                                        .+  everything else
                                                                           )  end capture group 7
                                                                            $ EOL
这假设您的结构是静态的,并且不是特别漂亮,但另一方面,对于分隔符潜入不应该存在的字段,应该是健壮的。例如,标题中有一个
似乎是合理的,它将打破“在任何地方拆分这些分隔符”类型的解决方案。比如说,

"Matrix:, Trilogy()   [FILM, reviewed: good]    (Canada() :   Québec  ,  \t Érik Canuel , ): 2009 ,   long ():():[][]métrage) FICTIO  , [(:N";
正确解析为:

数组
(
[0]=>矩阵:,三部曲()
[1] =>电影,评论:好
[2] =>加拿大():魁北克省
[3] =>埃里克·卡努埃尔
[4] => ): 2009 
[5] =>long():():[]métrage
[6] =>虚拟的,[(:N
)


此外,如果括号中的逗号区域长度可变,则可能需要先提取并解析它,然后处理字符串的其余部分。

您可以使用此正则表达式拆分:

([^\w:]\s[^\w:]?|\s[^\w:])
它查找非-(word或
)字符,后跟空格,后跟可选的非-(word或
)字符;或后跟非-(word或
)字符的空格。这将匹配所有所需的拆分模式。在PHP中(注意,需要
u
修饰符来处理unicode字符):

输出:

Array
(
    [0] => CADAVRES 
    [1] => FILM
    [2] => Canada : Québec
    [3] => Érik Canuel
    [4] => 2009
    [5] => long métrage
    [6] => FICTION
)

您想同时获取分隔符列表吗?还是仅获取所需的结果部分?避免在最新版本的PHP中使用
preg_split
作为其已停止使用的分隔符。@navederamzan不符合它的意思…@navederamzan您的意思是split()可能?@navederamzan,Nick,Andreas So split()不推荐使用,但preg_split()不推荐使用很好。谢谢!我不知道我们的哪个解决方案实际上更脆弱,但这是一种非常简洁的方法+1。
$input = "CADAVRES [FILM] (Canada : Québec, Érik Canuel, 2009, long métrage) FICTION";
$keywords = preg_split('/([^\w:]\s[^\w:]?|\s[^\w:])/u', $input);
print_r($keywords);
Array
(
    [0] => CADAVRES 
    [1] => FILM
    [2] => Canada : Québec
    [3] => Érik Canuel
    [4] => 2009
    [5] => long métrage
    [6] => FICTION
)