[ad_1]
単語と 1 (I) から 10 (X) までの 1 つ以上のローマ数字を含む文字列があります。
これらの数値を整数に置き換える必要があります。
これが私が試したことです:
PHP
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
しかし、これは機能しません。「VII」は「7」ではなく「511」に置き換えられます。
どうすれば修正できますか?
私が試したこと:
PHP
$reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word VII word ..."; $str2 = str_replace(array_keys($reps), $reps, $str);
解決策 2
に文書化されているように、 PHP: str_replace – マニュアル[^]、 str_replace()
最初から最後まで一致します。
やりたいことを行うには、すべての検索文字列をそのプレフィックスの前に置く必要があるため、次のような順序になります。
IV IX III II I VIII VII VI V X
機能するはずです。
解決策 3
上記とあなたのコメントに加えて、
あなたの問題は、上記のように、「str_replace」が配列内に出現する順序で置換を実行することです。 ‘strtr’ 関数を使用できます (PHP strtr 関数[^]) のすべての配列項目でテストされた正しい置換を返すカスタム置換関数とともに W3スクール編集者[^] –
HTML
<!DOCTYPE html> <html> <body> <?php $reps = [ 'I' => 1, 'II' => 2, 'III' => 3, 'IV' => 4, 'V' => 5, 'VI' => 6, 'VII' => 7, 'VIII' => 8, 'IX' => 9, 'X' => 10 ]; $str = "word word IX word ..."; function replaceNumerals($matches) { global $reps; return $reps[$matches[0]]; } $str2 = preg_replace_callback('/\b(?:' . implode('|', array_map('preg_quote', array_keys($reps))) . ')\b/', 'replaceNumerals', $str); print_r($str2); ?> </body> </html>
「単語 単語 9 単語 …」を返します。
[ad_2]
コメント