[ad_1]
我有一个字符串,其中包含单词和一个或多个从一 (I) 到十 (X) 的罗马数字。
我需要用整数替换这些数字。
这是我尝试过的:
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”被“511”代替,而不是“7”。
我该如何修复它?
我尝试过的:
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学校编辑[^] –
超文本标记语言
<!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]
コメント