preg_replace_callback
を使用して括弧内の数字と一致させてから、explode
とarray_map
を使用して整数に変換してソートし、範囲を確認してください。
機能:
function fixRange($match) {
// Extract the numbers
$numbers = array_map('intval', explode(',', $match[1]));
// Make sure they're sequential
sort($numbers);
$count = count($numbers);
$replacements = [];
for ($i = 0; $i < $count; $i++) {
$startNumber = $endNumber = $numbers[$i];
for ($j = $i + 1; $j < $count; $j++) {
if ($numbers[$j] === ($endNumber + 1)) {
$endNumber = $numbers[$j];
$i = $j;
} else {
break;
}
}
// Add range if $endNumber is not the same as $startNumber
$replacements[] = $startNumber . ($startNumber !== $endNumber ? '-' . $endNumber : '');
}
return '(' . implode(',', $replacements) . ')';
}
例:
<?php
$raw = "outside 1,2,12,13 (5,6,11,12,13,14,16,19,20,21)";
$result = preg_replace_callback('~\(([^\)]+)\)~', 'fixRange', $raw);
var_dump($result);
// string(38) "outside 1,2,12,13 (5-6,11-14,16,19-21)"
$raw = "outside 1,2,12,13 (5,6,11,12,13,14,16,19,20,21,22,23,25)";
$result = preg_replace_callback('~\(([^\)]+)\)~', 'fixRange', $raw);
var_dump($result);
// string(41) "outside 1,2,12,13 (5-6,11-14,16,19-23,25)"
DEMO
「3」と「11」は「外部」からどこに来ますか? – ClasG
あなたは範囲のことをする方法を参照してください:http://stackoverflow.com/q/33874059/3933332今すぐ正規表現を使用して、このコードを括弧内の数字に適用することができます。 – Rizier123
@ClasG誤字をおかけして申し訳ありません:p – Googlebot