⊗ppPmRgRCb 260 of 447 menu

PHP 정규식에서 콜백을 이용한 치환

다음과 같은 문자열이 있다고 가정해 봅시다:

<?php $str = '2+3= 3+5= 7+8='; ?>

숫자+숫자= 형태의 모든 패턴을 찾아서 등호 뒤에 덧셈 결과가 나타나도록 만들어야 합니다.

이런 문제를 해결하기 위해서는 preg_replace_callback 함수를 사용하는 것이 편리합니다. 이 함수는 preg_replace 함수와 유사하게 동작합니다. 정규 표현식을 기반으로 찾아서 치환하지만, 찾은 부분에 대한 추가적인 조작을 수행할 수 있습니다.

첫 번째 매개변수로 정규식을, 두 번째로 무엇으로 바꿀지를, 세 번째로 치환이 이루어질 문자열을 받습니다.

이때 두 번째 매개변수로는 각각의 발견된 일치 항목에 대해 호출될 콜백 함수를 전달해야 합니다.

콜백의 첫 번째 매개변수로는 발견된 항목이 들어갈 변수를 지정해야 합니다. 이 변수는 발견된 항목의 캡처 그룹 배열이 됩니다.

실제로 시도해 봅시다. 우리의 하위 문자열을 캡처하는 코드를 작성하되, 첫 번째 숫자는 첫 번째 캡처 그룹에, 두 번째 숫자는 두 번째 캡처 그룹에 넣어보겠습니다:

<?php $str = '2+3= 3+5= 7+8='; preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { var_dump($match); }, $str); ?>

결과적으로 var_dump는 세 번 작동하여 다음을 순서대로 출력합니다:

['2+3=', '2', '3'] ['3+5=', '3', '5'] ['7+8=', '7', '7']

다음으로 넘어가겠습니다. 각 일치 항목은 콜백이 return을 통해 반환하는 값으로 대체됩니다. 예를 들어 찾은 각 하위 문자열을 '!' 기호로 바꿔보겠습니다:

<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return '!'; }, $str); echo $res; // '! ! !'를 출력합니다. ?>

이제 각 하위 문자열을 그 안의 숫자 쌍의 합으로 바꿔보겠습니다:

<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return $match[1] + $match[2]; }, $str); echo $res; // '5 8 13'을 출력합니다. ?>

결과적으로 우리의 문제는 거의 해결되었습니다. 숫자 합계 앞에 원래 찾고자 했던 하위 문자열이 남도록 하면 됩니다. 이를 위해 합계 앞에 0번째 캡처 그룹의 내용을 삽입하겠습니다:

<?php $str = '2+3= 3+5= 7+8='; $res = preg_replace_callback('#(\d+)\+(\d+)=#', function($match) { return $match[0] . ($match[1] + $match[2]); }, $str); echo $res; // '2+3=5 3+5=8 7+8=13'을 출력합니다. ?>

다음 문자열이 주어졌습니다:

<?php $str = 'The numbers are 3, 7 and 12'; ?>

문자열의 모든 숫자를 그 숫자의 제곱으로 치환하세요.

기대하는 결과:

'The numbers are 9, 49 and 144'

다음 문자열이 주어졌습니다:

<?php $str = '2023-01-15 2022-12-31 2024-05-20'; ?>

모든 날짜를 일.월.년 형식으로 변환하세요.

다음 문자열이 주어졌습니다:

<?php $str = 'Costs: $15, $20, $100'; ?>

모든 가격을 10% 인상하세요.

한국어
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақКыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
우리는 웹사이트 운영, 분석 및 개인화를 위해 쿠키를 사용합니다. 데이터 처리는 개인정보 처리방침에 따라 이루어집니다.
모두 수락 설정 거부