ugrás a tartalomhoz

Regex - \n és \r probléma

whiteman0524 · 2009. Szep. 20. (V), 10.01
Üdv mindenkinek !

Nem találtam Regex-es topicot, ezért ide írom. A problémám, hogy kicsit belegabalyodtam a textarea sortöréseibe. Azt szeretném megoldani kommentek feldolgozásánál, hogy a 2db, vagy több üres sort, a rendszer cserélje le 1db üres sorra. Hogy "szépen" nézzenek ki a kommentek. Ha jól tudom, akkor a textarea-ban minden sortörést egy "\n\r"-karakterpáros jelez, tehát ez jelzi az "Enter"-eket. Próbálkoztam a következő regex-el :

$input = preg_replace("/\n\r\n\r(?:\n\r)+/","<br /><br/>", $input);

De ez sajnos nem működik. Próbáltam a következőt is hogy a sorok elejére illeszkedjen :

$input = preg_replace("/^\n\r(?:\n\r)+/","<br />", $input);

De ez se lett jó :( Valaki tudna esetleg segíteni ? Tehát a kettő vagy több üres sort cseréljük le egy üres sorra. A választ előre is köszönöm.
 
1

Még valami

whiteman0524 · 2009. Szep. 20. (V), 10.17
Továbbá próbálkoztam a :

$input = preg_replace("/(?:^$)+/","<br />", $input);

meghatározassal is, (ami szintén nem hozott sikert - mi több, ez konkrétan semmit se csinál), de még a következő fejlett sorhorgony illesztéssel is :

$input = preg_replace("/(?:^$)+/m","<br />", $input);

ha netán, esetleg. De egyik se lett jó. Most már kezdek ideges lenei, mert a probléma igazán egyszerű :D
7

\n

Drawain · 2009. Szep. 20. (V), 18.34
Próbálkozz sima \n -et cserélni, mert a boxban \n\r van, de javascriptből meghívva már csak a \n látszik.

Szerk: akkor itt felülbírálom magam ezek tükrében, valóban \r\n :)
2

\n\r != \r\n

Thom · 2009. Szep. 20. (V), 13.42
Szerintem az nem \n\r hanem \r\n
Azaz sor vége - új sor. és nem új sor - sor vége.
Legalábbis én még csak így találkoztam vele. Nem lehet, hogy csak ez a baj?
3

Igazad van :)

whiteman0524 · 2009. Szep. 20. (V), 14.30
Valóban, a helyes szintaktika a \r majd utána a \n és nem fordítva. Ha jól tudom a \r az a "kocsi vissza", és nekem valahogy úgy logikusabbnak tűnt, hogy új sor, majd "kocsi vissza". De tévedtem (Sőt abban sem vagyok biztos hogy a \r tényleg kocsi vissza karakter -e ? De valószínűleg). Most már tökéletesen működik :) Köszönöm a segítséget.
4

Windows

Poetro · 2009. Szep. 20. (V), 14.35
És persze azt is figyelembe kell venni, hogy a \r\n csak Windows alatt van, Linux alatt \n az alapértelmezett, MacOS alatt pedig a \r.
Persze a weben szinte mindenhol csak \n-t használunk.
5

Értem

whiteman0524 · 2009. Szep. 20. (V), 15.19
Tehát akkor én a következőképpen oldottam meg a dolgot. Először megkeresem a 3db vagy több sortörést és őket 2db-al helyettesítem :

$input = preg_replace("/\r\n\r\n(?:\r\n)+/","<br /><br />", $input);

Majd mégegyszer végigmegyek, és a maradék \r\n -eket <br /> ekké alakítom :

$input = preg_replace("/\r\n/","<br />", $input);

Ez tökéletesen működik.

De ahogy mondtad linux alatt \n van, arra pedig ez nem fog működni. Mi lenne ha átírnám eképpen ?

$input = preg_replace("/\r?\n\r?\n(?:\r?\n)+/","<br /><br />", $input);

majd :

$input = preg_replace("/\r?\n/","<br />", $input);

Így a \r -ek opcionálisak, tehát elméletileg a kifejezés most már Linux kompatibilis is. Remélem jó a megoldás.
6

\R

tgr · 2009. Szep. 20. (V), 16.48
Nem dokumentált (legalábbis a php.net-en), de a \R illeszkedik a \r-re, \n-re, \r\n-re meg még pár egzotikusabb Unicode sortörésre is.