[php] PHP 닫기 태그를 주석으로 변환

내 스크립트의 줄 중 하나에 문자열 안에 PHP 닫기 태그가 있습니다. 정상적인 작동에서는 문제가되지 않지만 줄을 주석 처리해야합니다.

나는이 라인을 주석 시도 //, /* */그리고 #있지만 작품의 아무도, 파서가 태그를 폐쇄하지 삼고 실제 닫는 태그로.

문제의 줄은 다음과 같습니다.

$string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i', '<br />', $string);
//                              ^^             ^^

위의 내용을 주석으로 처리하려면 어떻게해야합니까?



답변

트릭을 사용하십시오 : 문자열을 두 조각으로 연결하십시오. 이렇게하면 닫는 태그가 두 개로 잘리고 더 이상 유효한 닫는 태그가 아닙니다.'?>' --> '?'.'>'

귀하의 코드에서 :

$string = preg_replace('#<br\s*/?'.'>(?:\s*<br\s*/?'.'>)+#i', '<br />', $string);

이 것 //코멘트 작업을.

들어 /* */작업에 주석, 당신은 분할해야 할 것 */도 순서 :

$string = preg_replace('#<br\s*'.'/?'.'>(?:\s*<br\s*'.'/?'.'>)+#i', '<br />', $string);

전체가더라도, 때로는 기억 보다 당신이 더 남아 있습니다 시간이있다, 그러나 욕심은 나쁜 – 부분의 합보다 이하 . 🙂


답변

가장 쉬운 방법

정규식을 보유 할 별도의 변수를 작성하십시오. 이 방법으로 당신은 단순히 preg_replace()진술을 주석 처리 할 수 ​​있습니다

$re = '#<br\s*/?>(?:\s*<br\s*/?>)+#i';
// $string = preg_replace($re, '<br />', $string);

문자 클래스를 사용하여 수정

줄 설명을 수정하려면 다음과 같이 문자 클래스를 ?>넣 습니다 >.

$string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i', '<br />', $string);
                                 ^ ^              ^ ^

블록 주석을 수정하려면 다음에 적용하십시오 /.

$string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i', '<br />', $string);
                               ^ ^              ^ ^

모두 주석 스타일을 해결하려면, 당신은 넣을 수 있습니다 / > 자신의 문자 클래스이다.

수정 /x자를 사용하여 수정

x 개질제 – 일명 PCRE_EXTENDED– (그들은 문자 클래스 내부에서 발생하는 경우를 제외하고) 일반 식 무시 스페이스 개행; 이렇게하면 문제가있는 문자를 구분하기 위해 공백을 추가 할 수 있습니다. 두 가지 주석 스타일을 수정하려면

$string = preg_replace('#<br\s* /? >(?:\s*<br\s* /? >)+#ix', '<br />', $string);
                               ^  ^             ^  ^


답변

시도가 효과가없는 이유 :

// $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',...
                                   ^ doesn't work due to ?> ending php

/* $string = preg_replace('#<br\s*/?>(?:\s*<br\s*/?>)+#i',... */
                                 ^ doesn't work due to */ closing comment

작동하는 것 :

/* $string = preg_replace('#<br\s*[/]?>(?:\s*<br\s*[/]?>)+#i',... */
                                  ^ ^              ^ ^
// $string = preg_replace('#<br\s*/?[>](?:\s*<br\s*/?[>])+#i',...
                                    ^ ^              ^ ^

더욱이…

위의 후에는 /*라인을 주석 처리하는 데 사용할 수 있어야합니다 . ?>그대로 두면 //전체 줄을 주석 처리 할 수 ​​없습니다. 다음 텍스트 ?>는 html 일 수 있으며 , PHP 인터프리터 의 제어 범위를 벗어나 므로 작동하지 않습니다.

에서 문서 :

“한 줄”주석 스타일은 줄 끝 또는 PHP 코드의 현재 블록 중 하나에 만 주석을 답니다. 이것은 // …?> 또는 # …?> 뒤의 HTML 코드가 인쇄됨을 의미합니다.?>는 PHP 모드에서 빠져 나와 HTML 모드로 돌아가며 // 또는 #는 영향을 미치지 않습니다.


답변

또 다른 아이디어 : >(및 주석 /을 사용하려면 /*...*/) 을 탈출하십시오 .

$string = preg_replace('#<br\s*\/?\>(?:\s*<br\s*\/?\>)+#i', '<br />', $string);

“불필요한”이스케이프는 정규식 엔진에 의해 무시되지만이 경우에는 유용합니다 (다른 답변에 설명 된 이유로).


답변

문제를 해결하기 위해 복잡하고 읽기 어려운 “트릭”을 사용하는 이유는 무엇입니까?

? 편의상 수량화 단축키 일 뿐이므로

양의 긴 한정자를 사용하십시오.{0,1} “최소 0 최대 1 발생”을 의미합니다.

$string = preg_replace('#<br\s*/{0,1}>(?:\s*<br\s*/{0,1}>)+#i', '<br />', $string);


답변

RegEx 트릭 북에 추가 할 가치가있는 몇 가지 다른 방법 :

먼저 RegEx를 다음 /(<br\s*/?>)+/i과 같이 압축하여 바꿀 수 있습니다 <br />(RegExP에 부담을주지 않아도 됨). 항상 선택한 XHMTL 줄 바꿈으로 끝납니다.

*/종료 주석이나 ?>종료 스크립트를 트립하지 않도록 RegEx를 수정하는 다른 방법 :

  • 사용 소유 한정 기호 : #(<br\s*+/?+>)+#i– 어떤 기본적에 대한 의미 \s*+는, 거기에 그것을 유지로 많은으로 공백 일치하는 항목을 찾을 경우에 대한 /?+당신이 슬래시가 계속 발견하는 경우!
  • 둘러싸 \s*/*캡처 그룹 =>#(<br(\s*)(/?)>)+#i

라이브 데모 : http://codepad.viper-7.com/YjqUbi

우리가 소유 행동 또한 주석 문제가되는 우회 가장 빠른 정규식을 배웠어 그리고 이후 : 데모를 설명#(<br\s*+/?+>)++#i


까다로운 상황에서 논평하기

코드를 변경할 수 없거나 이미 여러 줄 주석을 사용한 경우 :

1. nowdoc을 사용하십시오 :

    $string='Hello<br>World<br><br />World<br><br><br>Word!';
    <<<'comment'
    $string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
comment;

라이브 코드 : http://codepad.viper-7.com/22uOtV

참고 : nowdoc는 A와 유사하다 히어 닥 하지만 콘텐츠를 구문 분석하지 않으며이있어 가지고있다 시작점 구분 안에 '작은 따옴표 '( 주는 것으로 결말 구분이 idented 수 없습니다 , 다음에해야 ;하고, 새로운 라인 ! )

2. goto로 코드를 뛰어 넘습니다 .

$string='Hello<br>World<br><br />World<br><br><br>Word!';
goto landing;
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
landing:

라이브 예 : http://codepad.viper-7.com/UfqrIQ

3. if(false)또는로 코드를 건너 뛰십시오 if(0).

$string='Hello<br>World<br><br />World<br><br><br>Word!';
if(0){
$string = preg_replace('#(<br\s*/?>)+#i', '<br />', $string);
}

테스트 : http://codepad.viper-7.com/wDg5H5


답변