PHP - jak stworzyć znak nowej linii?


405

W PHP próbuję utworzyć znak nowej linii:

echo $clientid;
echo ' ';
echo $lastname;
echo ' ';
echo '\r\n';

Następnie otwieram utworzony plik w Notatniku i zapisuje on nowy wiersz dosłownie:

1 John Doe \ r \ n 1 John Doe \ r \ n 1 John Doe \ r \ n

Próbowałem wielu odmian \r\n, ale żadna nie działa. Dlaczego nowa linia nie zmienia się w nową linię?


Odpowiedzi:


638

Tylko ciągi podwójnie cytowane interpretują sekwencje specjalne \ri odpowiednio \njako „0x0D” i „0x0A”, więc chcesz:

"\r\n"

Z drugiej strony ciągi cytowane znają tylko sekwencje specjalne \\i \'.

Więc jeśli nie połączysz łańcucha pojedynczego cudzysłowu z podziałem wiersza wygenerowanym w innym miejscu (np. Używając łańcucha podwójnego cudzysłowu "\r\n"lub chrfunkcji chr(0x0D).chr(0x0A) ), jedynym innym sposobem uzyskania podziału wiersza w ciągu pojedynczego cudzysłowu jest dosłowne wpisanie go za pomocą edytora:

$s = 'some text before the line break
some text after';

Pamiętaj, aby sprawdzić edytor pod kątem ustawień podziału wiersza, jeśli potrzebujesz określonej sekwencji znaków ( \r\nna przykład).


1
@Pacerier Jedynym sposobem na uzyskanie znaku powrotu karetki i nowego wiersza w ciągu pojedynczego cudzysłowu jest wprowadzenie znaków bezpośrednio z klawiatury (naciśnij Enter, w zależności od ustawień edytora na końcach wierszy). W przeciwnym razie skorzystaj z konkatenacji łańcuchów.
Gumbo,

1
@ Gumbo: Mówisz, że ciągi pojedynczego cudzysłowu znają tylko sekwencje specjalne \\ i \ '. Ale właśnie wydrukowałem linię z echem jako echo <? Php 'Używasz Internet Explorera. <br>'; echo „Dodano nową linię”; ?> i widział wyjście w przeglądarce. Dosłownie dodałem nową linię między dwoma napisami, które wyświetliłem. Oznacza to, że znak <br> lub <br/> zostanie rozwinięty w ciągu pojedynczego cudzysłowu. Czy są jakieś inne takie znaki HTML oprócz tych trzech, które PHP może zrozumieć wewnątrz pojedynczych cudzysłowów? Uprzejmie proszę o odpowiednią aktualizację odpowiedzi. Dziękuję Ci.
PHPFan

1
@ user2839497 To, co mówisz, nie ma sensu. Tutaj nie ma kontekstu przeglądarki. I oczywiście przeglądarka wyświetla nowy wiersz, gdy napotyka <br/>. I oczywiście nic nie stoi na przeszkodzie, aby dodać „<br/>” w ciągu pojedynczego cudzysłowu. Ale to nie renderuje nowego wiersza w prostym pliku tekstowym.
Szermierz

1
@Pacerier W przypadku polityki pojedynczego cytatu zamiast łamania wiersza w edytorze, jak sugerował Gumbo w swoim komentarzu, możesz użyć innego rozwiązania w odpowiedzi Gumbosa, na przykład: „wypisywanie znaku nowej linii” .chr (0x0A). ”W ciągu jednego cudzysłowu „.
Szermierz

2
Należy użyć PHP_EOLzamiast
kurdtpage

234

Użyj predefiniowanej PHP_EOLstałej:

echo $clientid, ' ', $lastname, PHP_EOL;

Stała wartość zostanie ustawiona zgodnie z zakończeniami linii systemu operacyjnego, w którym działa PHP. W Linuksie tak będzie "\n"; na Windowsie będzie "\r\n".


96

Polecenie „echo” w PHP wysyła dane wyjściowe do przeglądarki jako nieprzetworzony kod HTML, więc nawet jeśli w podwójnych cudzysłowach przeglądarka nie przeanalizuje go w dwóch wierszach, ponieważ znak nowej linii w HTML nic nie znaczy. Dlatego musisz albo użyć:

echo [output text]."<br>";

podczas używania „echa” lub zamiast tego użyj fwrite ...

fwrite([output text]."\n");

Spowoduje to wyświetlenie nowej linii HTML zamiast „\ n”.


4
Sposób, w jaki pytanie jest zadawane, jest prawdopodobne, że wysyła te dane do pola tekstowego lub javascript itp. W celu parsowania lub czytania zwykłego tekstu, które nie będą renderowane jako HTML
PC3TJ


23

Ciągi między podwójnymi cudzysłowami ""interpolują, co oznacza, że ​​przekształcają one znaki specjalne na znaki drukowalne.

Ciągi między pojedynczymi cudzysłowami ''są dosłowne, co oznacza, że ​​są traktowane dokładnie tak, jak znaki są wpisywane.

Możesz mieć oba na tej samej linii:

echo '$clientid $lastname ' . "\r\n";
echo "$clientid $lastname \r\n";

wyjścia:

$clientid $lastname
1 John Doe

Twoje wyjaśnienie różnych typów notacji ciągów w PHP jest w porządku, ponieważ pokazuje błąd popełniony przez autora pytania. Ale przykładowy kod nie przyniesie oczekiwanego wyniku, ponieważ zmienne są używane w ciągu pojedynczego cudzysłowu i, jak wspomniałeś, nie będą interpolowane!
Damien Flament,

@Damien Flament, Tak właśnie powiedziałem - treść między pojedynczymi cudzysłowami nie jest interpolowana, ale treść między podwójnymi cudzysłowami jest. Być może mój przykład jest mylący, ponieważ spodziewasz się zobaczyć zawartość $ clientid i $ lastname, a nie literałów „$ clientid” i „$ lastname”. Myślę, że był to nagłówek tabeli, której użyłem podczas debugowania. byłyby następujące wierszeecho "$clientid $lastname\r\n"
Kevin S. Miller,

Pisząc „oczekiwany wynik”, mówię o wyniku, którego autor oczekiwał w swoim pytaniu. Dodanie kodu podanego w komentarzu do odpowiedzi i wyświetlenie wyniku może poprawić jakość odpowiedzi.
Damien Flament,


13

W rzeczywistości \r\ndotyczy strony html danych wyjściowych. Za pomocą tych znaków możesz po prostu utworzyć nowy wiersz w kodzie HTML, aby był bardziej czytelny:

echo "<html>First line \r\n Second line</html>";

wyświetli:

<html>First line
Second line</html>

że przeglądanie strony będzie:

First line Second line

Jeśli naprawdę miałeś to na myśli, musisz po prostu naprawić pojedynczy cytat „”:

echo "\r\n";

W przeciwnym razie, jeśli chcesz podzielić tekst, w naszym przykładzie „Pierwszy wiersz” i „Drugi wiersz” musisz użyć kodu HTML <br />:

First line<br />Second line

które wygenerują:

First line
Second line

Byłoby również bardziej czytelne, jeśli zastąpisz cały skrypt:

echo "$clientid $lastname \r\n";

1
Nie, nie powinno. Ponieważ to w większości złe. Pierwszy blok kodu będzie renderowany jako First line Second line- dowolne białe znaki, w tym znaki nowej linii, zostaną skompresowane do jednego znaku spacji w renderowanym wyniku. Poza tym nie </br>jest to poprawny HTML.
D_4_ni

1
Pamiętaj również, że jeśli wysyłasz wiadomości e-mail za pomocą skryptu php, nadal będziesz potrzebować tych zakończeń linii zamiast przerw (<br>)
KennyV

9

w3school zaoferował w ten sposób:

echo nl2br("One line.\n Another line.");

korzystając z tej funkcji możesz to zrobić. Próbowałem innych sposobów, o których mowa powyżej, ale nie pomogą mi ..


Pytanie nie dotyczy przerywania linii w akapicie w HTML. Chodzi o znak nowej linii !
Damien Flament,

Dla kontekstu nl2br()funkcja konwertuje znaki nowego wiersza na <br />znacznik HTML. Może to być przydatne do tworzenia nowego wiersza na stronach przeglądarki, ale nie nowego wiersza w plikach tekstowych, JavaScript lub drukowania na ekranie lub konsoli.
SherylHohman

4

Z jakiegoś powodu każdy post z pytaniem o znaki nowej linii w PHP nie wspomina o przypadku, w którym po prostu wstawienie nowego wiersza do ciągów pojedynczych cudzysłowów zrobi dokładnie to, co myślisz:

ex 1.

 echo 'foo\nbar';

Przykład 1 wyraźnie nie drukuje pożądanego wyniku, chociaż prawdą jest, że nie można uciec od nowego wiersza w cudzysłowach, możesz mieć jeden:

ex 2.

 echo 'foo
 bar';

Przykład 2 ma dokładnie pożądane zachowanie. Niestety wstawiana nowa linia zależy od systemu operacyjnego. Zwykle nie stanowi to problemu, ponieważ przeglądarki / serwery internetowe poprawnie interpretują nowy wiersz, niezależnie od tego, czy jest to \ r, \ r \ n, czy \ n.

Oczywiście to rozwiązanie nie jest idealne, jeśli planujesz rozpowszechniać plik za pomocą innych środków niż przeglądarka internetowa i wiele systemów operacyjnych. W takim przypadku powinieneś zobaczyć jedną z pozostałych odpowiedzi.

Uwaga: korzystając z bogatego w funkcje edytora tekstu powinieneś być w stanie wstawić nowy wiersz jako znak binarny, który reprezentuje nowy wiersz w innym systemie operacyjnym niż ten, który edytuje plik. Jeśli wszystko inne zawiedzie, wystarczy użyć edytora szesnastkowego, aby wstawić binarny znak ascii.


3

Użyj PHP nl2br, aby uzyskać znaki nowego wiersza w ciągu tekstowym.

$ text = "Manu jest dobrym chłopcem. (Enter) Potrafi dobrze kodować.

echo nl2br ($ text);

Wynik.

Manu jest dobrym chłopcem.

Potrafi dobrze kodować.


1
nl2brKonwertuje znaki nowej linii do <br />tagu HTML. Jeśli ciąg nie zawiera znaku nowej linii, ta funkcja nic nie zrobi! Co więcej, pytanie nie dotyczy przerywania linii w akapicie w HTML. Chodzi o znak nowej linii !
Damien Flament,

2

Próbowałem również tę kombinację zarówno w pojedynczych i podwójnych cudzysłowach. Ale żaden nie zadziałał. Zamiast używać \nlepszego wykorzystania <br/>w podwójnych cudzysłowach. Lubię to..

$variable = "and";
echo "part 1 $variable part 2<br/>";
echo "part 1 ".$variable." part 2";

Pytanie nie dotyczy przerywania linii w akapicie w HTML. Chodzi o znak nowej linii !
Damien Flament,

2

Użyj chr (13) do powrotu karetki i chr (10) dla nowej linii

echo $clientid;
echo ' ';
echo $lastname;
echo ' ';
echo chr (13). chr (10);

2

W przypadku instrukcji echa zawsze używam <br>podwójnych cudzysłowów.


2
Pytanie nie dotyczy przerywania linii w akapicie w HTML. Chodzi o znak nowej linii !
Damien Flament,

1

Nic mi nie działało.

PHP_EOL

. "\r\n";

$NEWLINE_RE = '/(\r\n)|\r|\n/'; // take care of all possible newline-encodings in input file
$var = preg_replace($NEWLINE_RE,'', $var);

Pracuje dla mnie:

$admin_email_Body = $admin_mail_body .'<br>' ."\r\n";
$admin_email_Body .= 'This is line 2 <br>' ."\r\n";
$admin_email_Body .= 'This is line 3 <br>' ."\r\n";

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.