2014-03-29 3 views
0

문자열의 일부분에서만 개행을 바꾸려고합니다. 다음 내가 가진 가정 :문자열 부분에 개행 바꾸기

foo bar __level [ 
$save = 123, 
Info = '1234' 
] 
{Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate 
velit esse cillum dolore eu fugiat nulla pariatur.} 

내가 이것 저것을 대체 할 : 그것은 { 문자를 볼 때까지

foo bar __level [$save = 123,Info = '1234'] 
{Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate 
velit esse cillum dolore eu fugiat nulla pariatur.} 

그래서 기본적으로 줄 바꿈을 제거해야합니다. 나머지는 줄 바꿈을 유지해야합니다.

\s+을 사용하여 모든 줄 바꿈을 preg_replace으로 바꿀 수 있다는 것을 알고 있습니다. 그러나 나는 문자열의 작은 부분을 대체하기 때문에이 경우 어떻게하는지 잘 모릅니다.

이렇게하려면 preg_replace으로 어떻게 할 수 있습니까?

$pattern = '~(?:\[|(?!\A)\G)[^]\r\n]*\K\R+~'; 

$txt = preg_replace($pattern, '', $txt); 

패턴 세부 사항 : 모든 대괄호가 중첩 균형 아니라는 것을 가정

+0

'\ s'가 아니라 개행 문자, 공백 문자와 일치합니다. – faintsignal

+0

@faintsignal 그렇다. 그렇다면 replace는'preg_replace ('# \ s + #', '', $ str);'형식으로 될 것이다. 그래서 그것은 그 공간을 유지할 것입니다. – Vivendi

답변

1

,이 코드를 사용할 수 있습니다

(?:   # open a non capturing group 
    \[  # a literal opening square bracket 
    |   # or 
    (?!\A)\G # the position in the string after the last match 
)    # close the non capturing group 
[^]\r\n]*  # zero or more characters that are not ] or CR or LF 
\K   # resets all from match result 
\R+   # any type of newline one or more times 

패턴은 위에서 항상 닫는 대괄호가 있다고 가정 닫는 대괄호가없는 경우 여는 대괄호 뒤의 모든 텍스트는 문자열의 끝까지 처리됩니다. 이 동작을 변경하려면

, 당신은 닫는 대괄호의 존재를 확인하기 위해 내다 주장을 추가 (하지만 느린 패턴 수 있습니다)해야합니다

(?:\[|(?!\A)\G)[^]\r\n]*\K\R+(?=[^]]*]) 

소개 \G :
이 시작시에는 마지막 경기가 없기 때문에 그러나, \G은 문자열의 시작 (설정되어, 마지막 경기 후 문자열의 위치를 ​​나타내는 (이다 ^$\A\z 등) 앵커 \A 또는 ^). '(?!\A)


것은 당신이 돈 경우 :이 경우를 방지하려면 방법이 (이것은 당신이 제로 폭 주장을 취급하고 있기 때문에 정확히 동일) 후 또는 \G 전에 부정적 예측 또는 lookbehind을 추가하는 것입니다 단지 대괄호 약 t 케어 중괄호 사이의 내용을 건너 뛰려면, 당신은이 작업을 수행 할 수 있습니다

$pattern = '~(\R?\h*{[^}]*})|\R+~'; 

$txt = preg_replace($pattern, '$1', $txt); 

중괄호 부품 (주요 바꿈 함께 예에서와 같이) themselve하거나 대체됩니다

$pattern = '~\R?\h*{[^}]*}(*SKIP)(*FAIL)|\R+~'; 

$txt = preg_replace($pattern, '', $txt); 

(*FAIL)으로 하위 패턴을 강제로 수행하고 하위 패턴이 실패 할 때 하위 패턴을 다시 시도하지 못하도록 (*SKIP)을 지정했기 때문에 동일한 부분을 건너 뜁니다.그것은 여기 카시미르의 정규식보다 더 효율적이지만

1

몰라 경우 삼키는 아마 조금 쉽게 다른 방법입니다 :

$content = <<<'EOC' 
foo bar __level [ 
$save = 123, 
Info = '1234' 
] 
{Lorem ipsum dolor sit 
amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip 
ex ea commodo consequat. Duis aute irure dolor in 
reprehenderit in voluptate 
velit esse cillum dolore eu fugiat nulla pariatur.} 
EOC; 

$content = preg_replace_callback(
    '~^([^{]*)~', 
    function ($m) { 
    return str_replace(array("\r","\n"),'',$m[1]); 
    }, 
    $content 
); 

echo "<pre>".$content; 

출력 :

foo bar __level [$save = 123,Info = '1234']{Lorem ipsum dolor sit 
amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut 
labore et dolore magna aliqua. 
Ut enim ad minim veniam, quis nostrud exercitation ullamco 
laboris nisi ut aliquip 
ex ea commodo consequat. Duis aute irure dolor in 
reprehenderit in voluptate 
velit esse cillum dolore eu fugiat nulla pariatur.} 
+0

+1 좋은 생각입니다. 자주'preg_replace_callback'을 사용하면 더 쉽고 (때로는 더 빠른) 패턴 (또는 방법)을 작성할 수 있습니다. –

0

간단한 패턴 :

(?=\R)\R+(?=.*\R{) 

설명 : 사용

(?=   # a Positive Lookahead 
    \R  # for a new line 
)   # Lookahead end 
    \R+  # match the new line(s) 
(?=   # another Positive Lookahead 
    .*  # match every character until 
    \R  # another new line 
    {  # followed by a curly bracket 
)   # Lookahead end 

:

$string = preg_replace("/(?=\R)\R+(?=.*\R{)/s", "", $string); 

Live regex demo

Live PHP demo

관련 문제