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