2010-03-27 2 views
27

나는과 같이 텍스트 문자열을하려합니다 :preg_replace를 사용하는 PHP : "구분 기호는 영숫자 또는 백 슬래시가 아니어야합니다."오류가 발생합니다.

괄호 안에 양의 정수가 모든 인스턴스에서
$string = "This (1) is (2) my (3) example (4) text"; 

, 단순히 정수 자체와 그 대체하고 싶습니다.

$result = preg_replace("\((\d+)\)", "$0", $string); 

하지만 오류 "영숫자 또는 백 슬래시가 아니어야 구분"는 점점 계속 :

내가 지금 사용하고 코드입니다.

의견이 있으십니까? 여기에 다른 질문이 있다는 것을 알고 있습니다. 그러나 정규 표현식에 대한 지식만으로는이 예제로 넘어갈 수 없습니다.

+3

가 표시되지 않은 때문입니다 원래. @Christopher, 당신은 항상 코드 샘플 (특히 regexes!)을 4 개의 공백을 들여 쓰거나 백틱으로 묶어서 포맷해야합니다. –

+0

감사합니다. – Christopher

+0

여러분이 stackoverflow를 처음 접했을 때 그 답변 옆에있는 체크 표시를 클릭하여 가장 도움이되는 것으로 대답 **을 수락 할 수 있음을 알려드립니다. 자세한 답변은 – codaddict

답변

1

확인 문서 - 당신은 당신의 패턴 전후 구분 기호를 사용할 필요가 : "/\((\d+)\)/"

당신은 또한 그들이 리터럴이 아닌 중첩 일치하는 그룹이기 때문에 위의 바깥 쪽 괄호를 탈출 할 수 있습니다.

참조 : 당신은 분리 문자가 필요 preg_replace manual page

3

1)은 '/'잘 작동합니다.

2) '('및 ')'문자를 다른 그룹으로 생각하지 않도록 이스케이프해야합니다.

3) 또한 대체 변수는 0이 아닌 1에서 시작합니다 (0은 전체 텍스트 일치를 포함하며 괄호를 포함합니다).

$result = preg_replace("/\((\d+)\)/", "\\1", $string); 

이와 비슷한 것이 좋습니다. 더 궁금한 점이 있으시면 PHP's preg_replace() documentation으로 가셔도 좋습니다.

0

시도 :

<?php 
$string = "This (1) is (2) my (3) example (4) text"; 
$output = preg_replace('/\((\d)\)/i', '$1', $string); 
echo $output; 
?> 

괄호 문자는 정규 표현식 특수 문자입니다. 그들을 사용하려면 그들을 탈출해야합니다.

38

거의 다 왔어. 당신이 사용하는 :

$result = preg_replace("((\d+))", "$0", $string); 
  • 당신이 구분 기호의 쌍으로 구분해야합니다 기능 의 1 인수 preg_*에 가족으로 지정하는 정규식. 구분 기호를 사용하지 않으므로 해당 오류가 발생합니다.
  • ()은 정규식에서 메타 문자이므로 은 특별한 의미가 있음을 의미합니다. 리터럴 열기 괄호와 닫는 괄호를 일치 시키려면 \을 사용하여 이스케이프 처리해야합니다. \ 다음에 오는 문자는 모두 으로 처리됩니다.
  • 의 정수를 올바르게 캡처하면 \d+을 사용할 수 있습니다. 그러나 캡처 된 정수는 $1이 아니고 $0이 아닙니다.$0 은 괄호 안에 정수가 전체 일치를 갖습니다.

당신이 위의 모든 변경을 할 경우에 당신은 얻을 것이다 : 경우 사람이 모든 해답들이 이미있을 때 백 슬래시를 추가하는 말을 왜 궁금해 것

$result = preg_replace("#\((\d+)\)#", "$1", $string); 
+0

+1! : O –

+1

Gotcha. 구분 기호는 단지 무엇이든 될 수 있습니다. 나는 '#'과 '/'둘 다 보았다. – Christopher

+1

예, ~~, @@, {}, ##, //, !!을 사용할 수도 있습니다. 그리고 더 많은 :). 그러나 일반적으로 패턴에 나타나지 않는 구분 기호를 사용합니다. – codaddict

관련 문제