2016-06-15 2 views
-3

번호 범위를 캡처하여 숫자로 바꾸고 싶지만 특정 태그 내에서만 바꾸고 싶습니다.PHP를 사용하여 태그 사이의 텍스트를 편집하는 방법

$str = "This is some (the numbers are between 8, 9-12) and we have some 9-12 outside"; 

출력은 내가 괄호 사이에있는 만 9-12를 캡처해야하고,뿐만 아니라 9-12 외부 괄호로 교체

$str = "This is some (the numbers are between 8, 9, 10, 11, 12) and we have some 9-12 outside"; 

해야한다.

+1

. 간격 값을 추출하여 숫자 목록에서 변환 한 다음 간격을 바꾸는 함수를 만들 수 있습니다. –

+0

@ JorgeCampos 첫 번째 부분을 처리했지만 괄호 안에있는 부분 문자열 만 바꾸는 방법을 어떻게 제한합니까? – Googlebot

+1

'\ (. *? ([\ d] + - [\ d] +) \)'그리고 첫 번째 그룹 만 얻습니다 : https://regex101.com/r/lZ1tM5/2 –

답변

1

당신은 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)|[^(]*\(). 이런 방식으로, 패턴은 여는 괄호까지는 더 이상 실패하지 않을 것이지만, 패턴의 시작에서 (대부분의) 실패한 교대의 비용을 피하는 것을 제한 할 것입니다.

+1

이것은 환상적입니다! 나는 그 힘없는 것을 믿을 수 없다. 나는 더 좋은 대답이있을 수 있을지 의심 스럽다. – Googlebot

+1

@All : 감사합니다.하지만 패턴을 자주 향상시킬 수 있습니다 (특히 문자열에 대한 추가 정보가있는 경우). 어떤 일이 일어나는지 잘 이해하려면'\ G' 패턴이 어떻게 설계되었는지 * (SO에 많은 예가 있음) *, 어떻게 그리고 왜 작동하는지 (연속적이든 아니든간에) *. 일단 완료되면, 두 번째로 패턴을 개선하기 위해 여기에만있는 소유량 한정어를 검색 할 수 있습니다. –

0

이 시도 : 당신은 정규식이 할 수없는

preg_match_all('#\([^\)]+\)#', $str, $matches); 
foreach ($matches as $m) { 
    $str = str_replace($m, str_replace('-', ', ', $m), $str); 
} 
관련 문제