我有一些我想清理的数据。这应该是一个常见问题,但我还没有找到解决方案。数据如下所示,应转换为:
- 最简单的 -> 最简单的
- 夜,黑 -> 夜 - 黑
- Trip,A - Go west -> A Trip - Go west
- Muse, La: 3 chansons -> La Muse: 3 chansons
- 激情,拉(OMG)->拉激情(OMG)
- 约翰尼 - 一个值得追求的人,The -> 约翰尼 - 值得追求的人
- 和平,“伟大的” -> 和平的“伟大的”
一种特殊情况是双重出现:
- Internet Generation, The - Dream, A -> The Internet Generation - A Dream
保持原样,因为没有“停止”字符,并且“the”这个词不在末尾:
- 斗士查克 -> 斗士查克
所以有多个单词需要移动(the,a,la)到开头和几个“停止”字符[:,-,(,,,字符串结尾]。逗号前可以有空格,也可以没有.
我试图用 preg_replace 解决问题,但无法提出可行的解决方案。我相信对于更有经验的人来说是可能的。我非常感谢您在这方面的帮助!
我根据elclanrs 的回答使用的最终解决方案:
$tests = array(
"Easiest, The",
"Heaviest,The",
"Night, The - Is black",
"Trip,A - Go west",
"Muse, La: 3 chansons",
"Passion, La (OMG)",
"Johnny - One to go for, The",
"Peace, The \"Great one\"",
"Chuck, the fighter",
"Mason, the hero ",
"Internet Generation, The - Dream, A",
);
$patt = '/([^,:"(-]+)\s*?,\s*?([^,:"(-]+)/';
foreach ($tests as $test) {
if (preg_match('/(([:"(-]+)\s*?)|,\s*?\w+\s*?$/', $test)) {
echo trim(preg_replace('/\s+:/', ':', preg_replace('/\s+/', ' ', preg_replace($patt, '$2 $1 ', $test)))) . PHP_EOL;
} else {
echo "Not modified: " . $test . PHP_EOL;
}
}
这将给出:
The Easiest
The Heaviest
The Night - Is black
A Trip - Go west
La Muse: 3 chansons
La Passion (OMG)
Johnny - The One to go for
The Peace "Great one"
Not modified: Chuck, the fighter
Not modified: Mason, the hero
The Internet Generation - A Dream
所以我只是跳过不需要修改的字符串并删除所有不必要的空格。