2010-03-22 6 views
6

Tak więc funkcja nl2br jest przydatna. Z wyjątkiem mojej aplikacji internetowej, chcę zrobić coś odwrotnego, interpretować łamanie linii jako nowe linie, ponieważ będą one echo w formie wstępnie wypełnionej.Naprzeciwko nl2br? Czy to str_replace?

str_replace może zająć <br /> i zastąpić go, co chcę, ale jeśli wstawię \ n, to echa dosłownie odwróconego ukośnika i n. Działa to tylko wtedy, gdy umieszczę literalną przerwę linii w środku mojego skryptu i przerwę wcięcia (tak, że nie ma spacji końcowej).

Patrz:

<?=str_replace('<br />',' 
',$foo)?> 

brakuje znaków ewakuacyjnych? Myślę, że próbowałem wszystkich kombinacji ...

Odpowiedz

11

Czy piszesz '\n'? Ponieważ \ n będzie interpretowany poprawnie tylko wtedy, gdy otoczysz go podwójnymi cytatami: "\n".

Nie dotyczy: składnia <?= jest zła. Nie używaj go ze względu na innych programistów w zespole.

+4

Nie, to nie jest złe. Jest to problem tylko wtedy, gdy używasz typu dokumentu XML. I nawet wtedy łatwo się obejść. Wiele osób używa go w swoich poglądach. Jest znacznie bardziej kompaktowy niż ' ryeguy

+3

+0

@Julian Nie są źli, po prostu użyj ich tam, gdzie są odpowiednie. Najprawdopodobniej są to szablony widoków. Problem ze składnią shortag polega na tym, że typ dokumentu XML, '', Zostanie zinterpretowany przez PHP jako blok kodu, co spowoduje błąd składni. Teraz, jeśli nie korzystasz z XHTML, nie jest to problemem, ale jeśli tak, musisz zrezygnować z używania shorttagów lub po prostu 'echo' z doctype (co jest proste). – ryeguy

11

że tego chcesz:

<?=str_replace('<br />',"\n",$foo)?> 

Pewnie zapomniał użyć cudzysłowia. Łańcuchy są analizowane tylko dla znaków specjalnych, jeśli używasz podwójnych cudzysłowów.

+0

Podwójne kosztorysy - podchwytliwe. Myślałem, że oszaleję. –

17

Prawdopodobnie wystąpią sytuacje, w których Twój kod nie wystarczy; więc, co o czymś takim, aby zrobić swoje Zamiennik:

$html = 'this <br>is<br/>some<br />text <br />!'; 
$nl = preg_replace('#<br\s*/?>#i', "\n", $html); 
echo $nl; 

czyli nieco bardziej skomplikowane niż proste str_replace ;-)

Uwaga: Chciałbym ogólnie powiedzieć nie używać regex do manipulowania HTML - ale w tym przypadku, biorąc pod uwagę wyrażenie regularne byłoby całkiem proste, przypuszczam, że byłoby OK.


Należy również pamiętać, że użyłem "\n"

  • czyli nowej linii: \n
  • w double-quoted string, więc jest to interpretowane jako znak nowej linii, a nie dosłowne \n


Zasadniczo znacznik <br> zwykle wygląda tak:

  • <br>
  • lub <br/>, z dowolną liczbą spacji przed /

I że drugi punkt jest gdzie str_replace nie wystarczy.

+3

Zwalczono upadłość. Ta odpowiedź stanowi doskonały punkt. Jeśli możesz być pewien, że wszystko, co chcesz, aby br2nl został stworzony przez nl2br, jesteś gotowy. Jeśli interpretujesz dane wprowadzane przez użytkownika, zaakceptowanie dowolnego tagu końca linii jest koniecznością. – Matchu

+0

Znak?> W wyrażeniu regularnym nie powoduje problemów w PHP? –

0

po prostu pomijane nl2br() i wykorzystywane w inny sposób, to tak:

$post_content = str_replace('\n',"<br />",$post_content); 

i wszystko działa poprawnie.

Kompletny opis można znaleźć na moim blogu, tutaj:

How to use nl2br and reverse br2nl

0

Alternatywny do @PascalMARTIN „s odpowiedź

$string = stri_replace(array(
    '<br>', 
    '<br/>', 
    '<br />', 
), "\n", $string); 

to nie działa z wieloma białymi znakami, takimi jak <br />, ale to naprawdę rzadki przypadek.