2

我有一些我想清理的数据。这应该是一个常见问题,但我还没有找到解决方案。数据如下所示,应转换为:

  • 最简单的 -> 最简单的
  • 夜,黑 -> 夜 - 黑
  • 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

所以我只是跳过不需要修改的字符串并删除所有不必要的空格。

4

1 回答 1

1

这是一个可能的解决方案:

$tests = array(
    "Easiest, The",
    "Night, The - Is black",
    "Trip,A - Go west",
    "Muse, La: 3 chansonss",
    "Passion, La (OMG)",
    "Johnny - One to go for, The",
    "Peace, The \"Great one\""
);

$patt = '/([^,:"(-]+)\s*?,\s*?([^,:"(-]+)/';

foreach ($tests as $test) {
    echo preg_replace($patt, '$2 $1 ', $test) .'<br>';
}

这将打印出:

The Easiest 
The Night - Is black
A Trip - Go west
La Muse : 3 chansonss
La Passion (OMG)
Johnny - The One to go for 
The Peace "Great one"

如果您有更多规则,则必须更新令牌[^,:"(-]。这并不完美,因为您可以看到 之前有一个空格:,但是我将把它和特殊情况留给您...

于 2013-09-13T09:39:13.473 回答