당신은 preg_replace_callback
와 같이 그것을하고 \G
기반 패턴 할 수 있습니다
$str='This is some (the numbers are between 8, 9-12) and we have some 9-12 outside';
echo preg_replace_callback('~(?:\G(?!\A)|\()[^)0-9]*+(?:[0-9]++(?!-[0-9])[^)0-9]*)*+\K([0-9]++)-([0-9]+)~', function ($m) {
return implode(', ', range($m[1], $m[2]));
}, $str);
패턴의 세부 정보 :
~
(?: # two possible beginnings
\G(?!\A) # position after the previous match
| # OR
\( # an opening parenthesis
)
[^)0-9]*+ # all that is not a closing parenthesis or a digit
(?:
[0-9]++ (?!-[0-9]) # digits not followed by an hyphen and a digit
[^)0-9]*
)*+
\K # the match result starts here
([0-9]++) # group 1
-
([0-9]+) # group 2
~
당신이 경기를 얻는 단계의 수를 제한하려면 패턴 시작 부분을 (?:\G(?!\A)|\()
처럼 다시 쓸 수 있습니다 : \G(?:(?!\A)|[^(]*\()
. 이런 방식으로, 패턴은 여는 괄호까지는 더 이상 실패하지 않을 것이지만, 패턴의 시작에서 (대부분의) 실패한 교대의 비용을 피하는 것을 제한 할 것입니다.
. 간격 값을 추출하여 숫자 목록에서 변환 한 다음 간격을 바꾸는 함수를 만들 수 있습니다. –
@ JorgeCampos 첫 번째 부분을 처리했지만 괄호 안에있는 부분 문자열 만 바꾸는 방법을 어떻게 제한합니까? – Googlebot
'\ (. *? ([\ d] + - [\ d] +) \)'그리고 첫 번째 그룹 만 얻습니다 : https://regex101.com/r/lZ1tM5/2 –