선행 공백을 제거하는 정규식에 대한 도움
문제
Kohana 라이브러리의 핵심 기능을 수정하고 있습니다. 텍스트 :: auto_p () 기능.
이 함수는 자체를 "스테로이드의 NL2BR ()"로 설명합니다. 본질적으로, 그것은 제공합니다 <br />
단일 라인 브레이크이지만 더블 라인 브레이크는 다음으로 둘러싸여 있습니다. <p>
태그.
내가 찾은 한계는 <br />
s에서 s <pre>
요소. 이것은 내가 원하는 것이 아닌 이중 새로운 라인을 만들 것입니다. 나는 Regex와 함께 사전 요소를 픽업하기 위해 수정을했고, 콜백이 <br />
잘 작동합니다.
그러나 주요 문제는 내 텍스트에 코드 샘플이 있다는 것입니다. auto_p()
'D, 그리고 나는 들여 쓰기를 보존해야합니다 (가독성을 위해). 불행히도, 나에게는 기능이 선의 공백을 이끌고 후행합니다.
다음은 선행 공간을 벗기는 정규식입니다
$str = preg_replace('~^[ \t]+~m', '', $str);
나는 최고의 정규식 전문가는 아니지만 "적어도 하나가있는 곳이있는 곳과 탭을 공간으로 대체하는 공간과 탭을 얻으십시오"라고 확신합니다.
이 줄을 제거하려고 시도했지만 추가합니다. <br />
내가 그들을 원하지 않는 곳 - 어떤 경우에는 이렇게 출력을 받고 있었다
<ul><br />
<li>something</li>
</ul>
이 Regex 또는 Code를 어떻게 <pre>
요소?
Kohana의 원래 도우미 기능은 여기에서 제공됩니다. (거의 바닥으로 스크롤).
나는 몇 가지 'HTML Parser 사용'유형 답변을 얻을 수 있다는 것을 알고 있습니다. 그리고 당신이 정확할 수 있지만 기존 코드는 단순히 Regex를 사용하며 더 간단한 솔루션을 선호합니다 (라이브러리 등을 포함 할 필요가없는 곳). .
시간 내 줘서 고마워.
해결책
내가하는 방법은 다음과 같습니다.
$str = preg_replace(
'~^[ \t]++(?=(?:[^<]++|<(?!/?+pre\b))*+(?:\z|<pre\b))~im',
'', $str);
일부 라인을 향한 공백과 일치 한 후 Lookahead는 앞서 스캔합니다. <pre>
또는 </pre>
태그. 전망대의 고기는이 비트입니다.
(?:[^<]++|<(?!/?+pre\b))*+
왼쪽 각도 브래킷이 아닌 모든 것과 일치합니다. 또는 왼쪽 각도 브래킷이 시작되지 않으면 <pre>
또는 </pre>
꼬리표. 그 부분은 만날 때만 일치하지 않을 것입니다. <pre>
(시작) 태그, a </pre>
(종료) 태그 또는 입력 끝. 그것이 그것을 멈추는 결말 태그라면, 당신은 당신이 <PRE>
요소, 그래서 당신은 교체를하고 싶지 않습니다.
소유의 정량화 자 ('++'
, '*+'
, 그리고 '?+'
)는 예방하는 데 필수적입니다 치명적인 역 추적. (나는 그것을 도울 수 없다 : 그 문구는 항상 나를 생각하게한다 공명 캐스케이드 시나리오 ~에서 반감기.)
이 기술은 또한 합리적으로 잘 구성된 HTML을 가정합니다. <pre>...</pre>
태그가 올바르게 균형을 이룹니다. SGML 댓글 내부의 태그도 균형을 잡지 않는 한 엉망이됩니다. regex를 두 번 길고 3 배의 추악한 사람을 만드는 것이 마음에 들지 않으면 의견을 다룰 수 있습니다. :)
다른 팁