クリーンアップしたいデータがいくつかあります。これはよくある問題ですが、解決策が見つかりません。データは次のようになり、次のように変換する必要があります。
- 最も簡単、最も簡単 -> 最も簡単
- ナイト、ザ・ブラック -> ザ・ナイト - ブラック
- 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
そのため、変更する必要のない文字列をスキップし、不要なスペースをすべて削除しています。