我有一个包含字母和数字的 UTF8 字符串。例如:
"Hello World 37. What? 24 last 6650"
我只想反转数字,但将数字保持在同一个地方。输出应该是:
"Hello World 73. What? 42 last 0566"
echo preg_replace_callback('/\d+/', function (array $m) { return strrev($m[0]); }, $string);
在我发布这个问题之前,我考虑了一下并得到了一个适合我的想法,所以我发布这个问题只是为了丰富数据库。
function reverseNumbersInString($str){
$tokens = explode(" ", $str);
$res = "";
for ($i = 0; $i < sizeof($tokens); $i++){
if (intval($tokens[$i] > 0 )){
$tokens[$i] = strrev($tokens[$i]);
}
$res .= " " . $tokens[$i];
}
return $res;
}
这应该这样做:
$stringWithReversedNumbers = preg_replace_callback(
'/\d+/',
function ($matches) {
return strrev($matches[0]);
},
$originalString
);
或者,如果您只想对不同单词的数字进行操作(即不是另一个单词的一部分,如果您想hello123goodbye
保持不变,因为 123 本身不是一个单词),请更改\d+
为\b\d+\b
也许是这样的:
$string = "Hello World 37. What? 24 last 6650";
preg_match_all('/\d+/', $string, $matches, PREG_OFFSET_CAPTURE);
foreach ($matches[0] as $numberData) {
$numberArray = str_split($numberData[0]);
$reversedNumber = implode('', array_reverse($numberArray));
$string = substr_replace($string, $reversedNumber, $numberData[1], strlen($numberData[0]));
}