2

クリーンアップしたいデータがいくつかあります。これはよくある問題ですが、解決策が見つかりません。データは次のようになり、次のように変換する必要があります。

  • 最も簡単、最も簡単 -> 最も簡単
  • ナイト、ザ・ブラック -> ザ・ナイト - ブラック
  • Trip,A - 西へ -> A Trip - 西へ
  • ラ・ミューズ: シャンソン3曲 -> ラ・ミューズ: シャンソン3曲
  • パッション、ラ (OMG) -> ラ パッション (OMG)
  • ジョニー - 行く人、ザ -> ジョニー - 行く人
  • 平和、「偉大なる者」 -> 平和「偉大なる者」

特別な状況は二重発生です:

  • インターネット世代、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