모범 사례 : PHP에서 길고 여러 줄로 된 문자열로 작업합니까?


177

참고 : 이것이 매우 간단한 질문이라면 유감이지만 내 코드 형식에 대해 다소 강박 적입니다.

전자 메일의 본문을 구성하는 문자열을 반환하는 함수가있는 클래스가 있습니다. 이 텍스트가 전자 메일에 올바르게 표시되도록 형식을 지정하고 싶지만 코드가 펑키하게 보이지 않습니다. 여기 내가 의미하는 바가있다 :

class Something
{
    public function getEmailText($vars)
    {
        $text = 'Hello ' . $vars->name . ",

The second line starts two lines below.

I also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
        return $text;
    }
}

그러나 다음과 같이 쓸 수도 있습니다.

public function getEmailText($vars)
{
    $text = "Hello {$vars->name},\n\rThe second line starts two lines below.\n\rI also don't want any spaces before the new line, so it's butted up against the left side of the screen.";
    return $text;
}

그러나 새로운 줄과 캐리지 리턴은 어떻게 처리됩니까? 차이점이 뭐야? 인가 \n\n에 해당하는 \r\r\n\r? 선 사이에 선 간격을 만들 때 어떤 것을 사용해야합니까?

그런 다음 출력 버퍼링 및 heredoc 구문 옵션이 있습니다.

객체에 긴 여러 줄 문자열을 사용하는 방법은 무엇입니까?


3
나는 항상 \ n이 유닉스에서 줄 바꿈이라고 생각했다. \ r은 OS / X 이전의 MacOS에서 줄 바꿈이고 \ r \ n은 Windows에서 줄 바꿈이라고 생각했다. 또한 이것이 전자 메일 메시지에 표시되는 문자열이 될 것이라는 점을 고려할 때 대부분의 명령 메일 클라이언트에서 수행하는 방식이 올바르게 표시되는지 확인해야합니다. 힌트 : Outlook은 경우에 따라 줄 바꿈 문자를 추가로 제거하므로 항상 원하는 것을 얻을 수있는 것은 아닙니다.
Kenny Drobnack 2009

1
그것이 중요한지 확실하지 않지만 원래 두 개의 '줄 바꾸기'문자는 두 개의 문자를 사용하는 실제 타자기를 사용했을 때 나온 것입니다. 하나는 캐리지를 페이지의 왼쪽 (CR-0xD)에 다시 놓기위한 것이고 다른 하나는 페이지를 다음 줄 (LF-0xA)로 이동시키는 것입니다. 이것에 대해 더 많은 사람들이 알고 있습니다 하나.
mkgrunder 2009

답변:


289

HEREDOC 또는 NOWDOC을 사용해야합니다.

$var = "some text";
$text = <<<EOT
  Place your text between the EOT. It's
  the delimiter that ends the text
  of your multiline string.
  $var
EOT;

Heredoc과 Nowdoc의 차이점은 heredoc에 포함 된 PHP 코드가 실행되는 반면 Nowdoc의 PHP 코드는 그대로 인쇄된다는 것입니다.

$var = "foo";
$text = <<<'EOT'
  My $var
EOT;

이 경우 $ text의 값은 My $var입니다.

참고 : 닫기 전에 EOT;공백이나 탭이 없어야합니다. 그렇지 않으면 오류가 발생합니다


왜? 첫 번째 EOT와 두 번째 EOT 사이의 모든 것은 그대로 문자열로 간주되기 때문입니다. 따라서 여러 줄 문자열 전체에 백 슬래시 n을 넣을 필요가 없습니다. @Fabian : HEREDOC과 NOWDOC의 차이점은 무엇입니까, 아니면 같은 것입니까?
Kenny Drobnack 님이 2009

4
@powtac : 아니요, heredoc을 끝내려면 새 줄에 있어야하기 때문입니다. 특히, EOT;공백이 없어야합니다.
Powerlord

Nowdoc에 대한 설명을 추가했습니다.
halfdan 2009

6
@halfdan, 뭔가 빠졌습니까? 단순히 "Enter"키를 입력 하고 일반 문자열처럼 따옴표로 여러 줄 문자열을 둘러 쌀 수 있는데 왜 heredocs 및 nowdocs를 방해 합니까?
Pacerier

3
답변에 이것을 추가하십시오 : 마지막 EOT;에는 공백이나 탭이 없어야합니다. 그렇지 않으면 오류가 발생합니다.
Shnd

44

나는 pix0r과 비슷한 시스템을 사용하며 코드를 읽을 수 있다고 생각합니다. 때로는 실제로 줄 바꿈을 큰 따옴표로 분리하고 문자열의 나머지 부분에 작은 따옴표를 사용하는 경우가 있습니다. 이렇게하면 텍스트의 나머지 부분에서 눈에 띄며 큰 따옴표로 묶은 문자열에 연결하는 대신 연결을 사용하면 변수가 더 잘 나타납니다. 따라서 원래 예제를 사용하여 이와 같은 작업을 수행 할 수 있습니다.

$text = 'Hello ' . $vars->name . ','
      . "\r\n\r\n"
      . 'The second line starts two lines below.'
      . "\r\n\r\n"
      . 'I also don\'t want any spaces before the new line,'
      . ' so it\'s butted up against the left side of the screen.';

return $text;

줄 바꿈과 관련하여 이메일에는 항상 \ r \ n을 사용해야합니다. PHP_EOL은 php가 실행되는 것과 동일한 운영 체제에서 사용되는 파일을위한 것입니다.


IDE에서 그 들여 쓰기를 설정 했습니까?
Krzysztof Trzos 2016 년

25

긴 텍스트에 템플릿을 사용합니다.

email-template.txt는

hello {name}!
how are you? 

PHP에서 나는 이것을한다 :

$email = file_get_contents('email-template.txt');
$email = str_replace('{name},', 'Simon', $email);

웹 애플리케이션의 디렉토리 구조에서 템플릿을 어디에 저장합니까?
Andrew

내 코드는 단지 데모입니다. 거대한 웹 앱의 경우 / templates / emails /, / templates / userfeedback /과 같은 구조를 사용할 수 있습니다. 그러나 더 많은 것을 가지고 있다면 SMARTY와 같은 완전한 템플릿 시스템을 권장합니다.
powtac

Dwoo dwoo.org 는 훌륭한 SMARTY 호환 PHP 템플릿 시스템으로, 일부는 훌륭한 후계자로 간주됩니다 (PHP5에서 시작되었으므로 PHP4 수하물은 없습니다).
micahwittman 2009

19

문자열 중간에 추가 \n및 / 또는 \r중간에 코드가 너무 길면 두 번째 예와 같이 기분이 좋지 않습니다. 코드를 읽을 때 결과가 표시되지 않으며 스크롤해야합니다 .

이런 종류의 상황에서 나는 항상 Heredoc (또는 Nowdoc, PHP> = 5.3을 사용하는 경우)을 사용합니다 : 작성하기 쉽고, 읽기 쉽고, 긴 줄이 필요하지 않습니다 ...

예를 들면 :

$var = 'World';
$str = <<<MARKER
this is a very
long string that
doesn't require
horizontal scrolling, 
and interpolates variables :
Hello, $var!
MARKER;

단 한 가지 : 끝 마커 (및 그 ;뒤에 ' ')가 줄에있는 유일한 것이어야합니다 : 전후에 공백 / 탭이 없습니다!


12

물론 HEREDOC을 사용할 수는 있지만 코드 가독성이 좋으면 첫 번째 예제보다 문자열이 여러 줄로 줄 바꿈되어 실제로는 좋지 않습니다.

여러 줄 문자열이 잘 보이고 코드와 잘 흐르기를 원한다면 문자열을 함께 연결하는 것이 좋습니다.

$text = "Hello, {$vars->name},\r\n\r\n"
    . "The second line starts two lines below.\r\n"
    . ".. Third line... etc";

HEREDOC 또는 여러 줄 문자열보다 약간 느릴 수 있지만 코드의 들여 쓰기와 함께 잘 흐르고 읽기 쉽습니다.


9

Javascript에서는이 방법을 조금 더 좋아하지만 아직 언급되지 않았으므로 여기에 포함시키는 것이 좋습니다.

$var = "pizza";

$text = implode(" ", [
  "I love me some",
  "really large",
  $var,
  "pies.",
]);

// "I love me some really large pizza pies."

작은 것들을 위해, 종종 연결된 문자열과 비교하여 배열 구조로 작업하는 것이 더 쉽다는 것을 알았습니다.

관련성 : 임 포드 대 연결 성능


1

그것을 믿는 사람

"abc\n" . "def\n"

여러 줄 문자열이 잘못되었습니다. 여러 줄 문자열이 아닌 연결 연산자가있는 두 개의 문자열입니다. 이러한 연결된 문자열은 예를 들어 사전 정의 된 배열의 키로 사용될 수 없습니다. 불행히도 PHP는 실제 여러 줄 문자열을 제공하지 않습니다.

"abc\n"
"def\n"

전용 HEREDOCNOWDOC중첩 부호 등이 오목 구가 파손되기 때문에, 템플릿에 더 적합한 구문.


1

당신은 또한 사용할 수 있습니다 :

<?php
ob_start();
echo "some text";
echo "\n";

// you can also use: 
?> 
some text can be also written here, or maybe HTML:
<div>whatever<\div>
<?php
echo "you can basically write whatever you want";
// and then: 
$long_text = ob_get_clean();

0

줄 바꾸기 및 캐리지 리턴에 대한 귀하의 질문과 관련하여 :

크로스 플랫폼 호환성 문제를 해결할 수 있도록 사전 정의 된 전역 상수 PHP_EOL 을 사용하는 것이 좋습니다 .

이 질문에 미리 SO에 제기되었으며 당신이 읽고 자세한 정보를 찾을 수 있습니다 " 나는 PHP 상수의 PHP_EOL를 사용 할 때 "


1
이 답변에 대한 의견은 이메일의 새 줄에 \ r \ n을 사용해야한다는 것을 제안합니다. stackoverflow.com/questions/128560/…
Andrew

0

그러나 새로운 줄과 캐리지 리턴은 어떻게 처리됩니까? 차이점이 뭐야? \ n \ n은 \ r \ r 또는 \ n \ r에 해당합니까? 선 사이에 선 간격을 만들 때 어떤 것을 사용해야합니까?

여기에 아무도 실제로이 질문에 대답하는 것처럼 보이지 않았으므로 여기에 있습니다.

\r '캐리지 리턴'을 나타냅니다

\n '줄 바꿈'을 나타냅니다

그들에 대한 실제 이유는 타자기로 돌아갑니다. '캐리지'를 입력하면 문자별로 타자기의 오른쪽으로 천천히 미끄러 져 움직입니다. 당신이 행의 마지막에 도착했을 때 당신은 것 캐리지를 반환 하고 새로운 라인으로 이동합니다 . 새로운 줄로 가려면 을 타이프 라이터에 공급 하는 레버를 뒤집습니다 . 따라서 이러한 조치를 캐리지 리턴 라인 피드 라고 합니다. 문자 그대로 :

줄 바꿈 \n은 다음 줄로 이동하는 것을 의미합니다.

캐리지 리턴 \r은 커서를 줄의 처음으로 이동시키는 것을 의미합니다.

궁극적으로 Hello\n\nWorld화면에 다음과 같은 출력을 초래할한다 :

Hello

     World

어디로 Hello\r\rWorld발생한다 다음과 같은 출력 .

\r\n알려진 줄에 대한 일반적인 이해가있는 2 개의 문자 를 결합 할 때만 가능 합니다. IE Hello\r\nWorld는 다음과 같은 결과를 가져 옵니다 .

Hello
World

그리고 물론 \n\r동일한 시각적 출력을 얻을 것 \r\n입니다.

원래 컴퓨터했다 \r\n문자 그대로. 그러나 요즘 캐리지 리턴에 대한 지원은 드물다. 일반적으로 모든 시스템 \n에서 자체적 으로 사용하여 벗어날 수 있습니다 . 그것은 OS에 의존하지 않지만 출력을보고있는 것에 달려 있습니다.

여전히 나는 항상 \r\n당신이 할 수있는 곳을 사용하는 것이 좋습니다!

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