[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);
}