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


149

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

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

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

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

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


18
재미있는 문제지만 진짜입니다. 나는 투표한다.
Voitcus

17
세상에 처음에 나는 당신의 질문에 회의적이었습니다. 문제가 무엇인지 물어볼 준비가되었지만 '?>'를 포함하는 문자열로 줄을 주석 처리하려고했는데 그것을 얻었습니다. 이것은 phpsadness.com
lolesque

6
이러한 "기능"의 유용성은 php.net/manual/en/language.basic-syntax.comments.php에 설명되어 있으며 one-liner의 경우 유용합니다 <?php # echo 'simple';?>.
lolesque

2
@lolesque 해당 링크에 감사드립니다. 좋은 것입니다. 다른 언어도 다루는 관련 언어 : wiki.theory.org/YourLanguageSucks
Simon Forsberg

5
@ OndraŽižka 그가하고있는 일은 반복되는 br 태그를 제거하는 것입니다. 정규식이 잘 작동합니다. 그것이 나쁘기 때문에 항상 나쁘다는 것을 의미하지는 않습니다.
Kip

답변:


124

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

귀하의 코드에서 :

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

이 것 //코멘트 작업을.

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

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

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


@ ppeterka 와우, 나는 그것에 대해 생각조차하지 않았다. 감사합니다.
v1n_vampire

1
2 일 전에 C에서이 트릭을 사용해야했습니다.??<
Ryan Amos

2
대단해 왜 그렇게 생각하지 않습니까!?
San

73

가장 쉬운 방법

정규식을 보유 할 별도의 변수를 작성하십시오. 이 방법으로 당신은 단순히 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);
                               ^  ^             ^  ^

@Cthulhu +1 (물론 대답도). 또한 (적어도 나를 위해) 이것은 정규 표현식을 이해하기 조금 어렵게 만듭니다. 별로는 없지만이 정규식을 보았을 때 나는 말할 것입니다 : 흠, 무슨 일이야? 그러나 그것은 완전히 주관적입니다.
ppeterka

1
@ ppeterka 나는 다소 동의한다. 그래서 나는 x수정자를 사용함으로써 다른 방법을 찾았다. :)
Ja͢ck

@ 잭 니스, 나는 그것을 위해 또 다른 +1을 줄 것이다. 나는 새로운 것을 배웠다. 나는 정규 표현식 수정자를 잊어 g
버린다

@ 잭 감사합니다. 솔루션에서 정규식에 대한 새로운 것을 배웁니다.
v1n_vampire

1
정규식을 이전 줄로 분리하기 위해 +1. 정규식을 동일하게 유지하지만 논리에 주석을 달 수 있습니다.

38

시도가 효과가없는 이유 :

// $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 모드로 돌아가며 // 또는 #는 영향을 미치지 않습니다.


고마워요, 아직도 모르는 것들이 많이 있습니다 ... 도움이됩니다.
v1n_vampire

4
이 글은 더 많은 +1을받을 가치가 있습니다 ... 철저한 설명만으로.
ppeterka

15

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

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

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


@ppeterka : 나는 백 슬래시 대신에 문자 클래스를 사용하는 (그러나 예, 나는 미스 하나 명 발생했다 감사합니다.!)
팀 Pietzcker에게

죄송합니다, 피곤해 보입니다 ... 두 번째 것이 눈에
띄었

10

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

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

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

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

1
+1이 페이지는 우리의 마음을 사로 잡기 위해 정규식 트릭을 수집하기에 매우 좋은 장소가되기 시작합니다.
ppeterka

1
@ ppeterka, 실제로 다른 모든 답변을 "트릭"이라고 부르지 만 내 대답은 바로 가기가 아닌 긴 버전의 수량 화기를 사용하고 있습니다.
stema

3
더 짧은, 더 편리한 구문 설탕 대신 긴 버전의 표현을 사용하는 사전은 그저 속임수로 간주됩니다.
ppeterka

8

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.