Порядок регулярных выражений важен.Я не уверен, что если это полностью решит проблему, то метод такого подхода может быть в корне ошибочным, но вы можете попробовать это:
$regex = [];
for($i=0;$i<10;$i++) {
$str = "";
for($a=0;$a<10;$a++) {
if($a > $i) {
$str .= $a;
if(strlen($str)>1) {
$regex[] = $str;
}
}
}
}
usort($regex, function($a,$b){
return strlen($b) <=> strlen($a);
});
$myregex = '/'.implode('|', $regex).'/';
Что делает числовые последовательности массивом, то этосортирует их по длине и упорядочивает сначала самые длинные последовательностиКонечный результат (после сопоставления)
array(1) {
[0]=>
array(9) {
[0]=>
string(3) "234"
[1]=>
string(2) "12"
[2]=>
string(4) "6789"
[3]=>
string(2) "12"
[4]=>
string(3) "123"
[5]=>
string(5) "45678"
[6]=>
string(2) "12"
[7]=>
string(2) "12"
[8]=>
string(7) "2345678"
}
}
Также обратите внимание, что оператор космического корабля <=>
работает только в PHP7 +
Надеюсь, это поможет.
Песочница
и не переходить к следующим символам после матча
Я не думаю, что это возможно с регулярным выражением, если вы хотите найти 23
234
2345
все сразу, например, 2345607
.Однако, если он соответствует длинной последовательности, то логично предположить, что он должен соответствовать более короткой.Таким образом, вы можете просто обрезать номер правой руки, пока длина не станет 2 и получить совпадения.