문제

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 배의 추악한 사람을 만드는 것이 마음에 들지 않으면 의견을 다룰 수 있습니다. :)

다른 팁

귀하의 문제는 많이 논의됩니다.이 링크를 확인하십시오.

http://us3.php.net/manual/en/function.nl2br.php#91828

이것도 :

http://us3.php.net/manual/en/function.nl2br.php#39641

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top