Autor | Zpráva | ||
---|---|---|---|
Petroff Profil |
#1 · Zasláno: 13. 3. 2008, 11:53:46
Potřebuji předat řetězec multilinestring (obsahující znaky \n) skriptu php:
JSloader.src="reqst.php?text="+multilinestring; (v php převedu odřádkování na <br /> pomocí nl2br) Bez konverze před odesláním (+ zpětná konverze v PHP) se odřádkování ztratí. Nějaký jednoduchý způsob ??? |
||
vertigo4 Profil |
#2 · Zasláno: 13. 3. 2008, 11:55:26
Petroff
a proč to nepřevedeš až po předání? |
||
Petroff Profil |
#3 · Zasláno: 13. 3. 2008, 11:58:24
Bez úpravy dorazí do php:
$text="1.radek2.radek3.radek" znaky \n chybí |
||
Měsíček Profil |
#4 · Zasláno: 13. 3. 2008, 12:00:20
Tak jim tam pošli třeba znak # a potom ho převeď na \n
|
||
Petroff Profil |
#5 · Zasláno: 13. 3. 2008, 12:02:24 · Upravil/a: Petroff
multilinestring je obsah textarey f.txtA.value
Myslíš provést f.txtA.value.replace(/\n/g,"#"); ??? A co se znaky # obsažené v textu :-[ |
||
Měsíček Profil |
#6 · Zasláno: 13. 3. 2008, 12:05:39
a \/n\/ ? na konci nahradit na \n?
|
||
los Profil * |
#7 · Zasláno: 13. 3. 2008, 12:06:24
encodeURIComponent(f.txtA.value)
|
||
Petroff Profil |
#8 · Zasláno: 13. 3. 2008, 12:06:59 · Upravil/a: Petroff
Zkusím
a co zpět (neznám php funkční výbavu) ?? |
||
vertigo4 Profil |
#9 · Zasláno: 13. 3. 2008, 12:25:09
Petroff
tak to odřádkování převěd na nějaký číselný kod třeba 0125642975413238 |
||
Petroff Profil |
#10 · Zasláno: 13. 3. 2008, 12:37:45
Zkusím se mrknout, jestli v php funkcích není eqiwalent js decodeURIComponent (zdá se, že těch znaků kromě \n bude víc)
|
||
Chamurappi Profil |
#11 · Zasláno: 13. 3. 2008, 12:44:07
Reaguji na Petroffa:
Funkce encodeURIComponent zakóduje jakýkoliv řetězec do podoby, která je dovolená v URI — stejně, jako když se posílá cokoliv GETem (zkus si odeslat <form> s víceřádkovým <textarea>). Dekódování provádí server sám od sebe, žádnou speciální funkci nepotřebuješ. Dej si ale pozor, aby výsledná URI nebyla moc dlouhá, Explorer má limit tuším někde kolem 2 kB, zbytek ořízne. |
||
Petroff Profil |
#12 · Zasláno: 13. 3. 2008, 14:44:00 · Upravil/a: Petroff
Já ale form neodesílám z důvodu aby nedošlo k reloadu stránky. Jen využívám form.prvky k zadání jména a textu příspěvku.
Takže se o to zakódování musím postarat sám - v podstatě provádím toto: <script src="xxx.php?add=true&jmeno='+f.jmeno.value+'&text='+zakoduj(f.text.va lue)> Zkusil jsem použít encodeURIComponent(f.txtA.value) : scriptLoader.src = 'rqst.php?text='+encodeURIComponent(f.text.value); a v PHP: $text = nl2br($text); echo "alert(\"\$text = $text\");"; Výsledek: 1řádkový text .... $text=ahoj => php provedl alert("$text = ahoj") ) 2řádkový text .... [ERROR: unterminated string literal] [Break on this error] alert("$text = aaa<br />\n Mám tam \n navíc a jsem tam kde jsem byl....ale zkusím ty \n odfiltrovat. <To Chamurappi> Jinak jsem zjistil že encodeURIComponent("\n") => %0A což je zakodovaný znak LF=chr10 Kdežto form odesílá GETem odřádkování (v textarea) jako %0D což je zakodovaný znak CR=chr13 |
||
Chamurappi Profil |
#13 · Zasláno: 13. 3. 2008, 14:58:16
Reaguji na Petroffa:
„src="xxx.php?add=true&jmeno='+f.jmeno.value+'&text='+zakoduj(f.text. value)"“ I to jméno bys měl projet encodeURIComponentem. „Zkusil jsem použít encodeURIComponent“ Což je dobře. Chtěl jsi ten konec řádku dostat do PHP — a to se povedlo. „a v PHP: $text = nl2br($text);“ Tím převedeš konec řádku na <br> a to asi nechceš. Teď už nepotřebuješ protlačit kus textu od klienta přes adresní řádek do PHP, ale protlačit řetězec z PHP do řetězce v klientském skriptu. Tudíž na straně serveru musíš nahradit zpětná lomítka za „\\“, konce řádků za „\n“ a uvozovky za „\"“. |
||
peta Profil |
#14 · Zasláno: 13. 3. 2008, 15:36:57
Petroff
http://xkr.us/articles/javascript/encode-compare/ A to jeste je rozdil v utf-8 utf-7 a utf-16 pri kodovani do %. JS z toho zvlada maloco. |
||
Petroff Profil |
#15 · Zasláno: 14. 3. 2008, 08:02:32 · Upravil/a: Petroff
<To Chamurappi>
Tudíž na straně serveru musíš nahradit zpětná lomítka za „\\“, konce řádků za „\n“ a uvozovky za „\"“. Zjištěno [při použití xxx.src = 'xxx.php?text='+encodeURIComponent(f.textarea.value);] : <TEXTAREA> [key]= Enter \ " ' ( SERVER ) $text= ORD=10 \\ \" \' Ostatní znaky jsou OK = nezměněny (používám UTF-8) <To Petroff> Kdežto form odesílá GETem odřádkování (v textarea) jako %0D což je zakodovaný znak CR=chr13 MALÝ OMYL: odesílá dvojici %0D%0A |
||
Chamurappi Profil |
#16 · Zasláno: 14. 3. 2008, 11:15:12
Reaguji na Petroffa:
„MALÝ OMYL: odesílá dvojici %0D%0A“ Záleží na operačním systému. Windows používá na konec řádku CRLF (v JS "\r\n", hexadecimálně 0D0A), Unixy používají LF (v JS "\n", hexadecimálně 0A). Nějak si to sjednoť. „Zjištěno …“ Funkce encodeURIComponent nikdy nedoplňuje zpětná lomítka. Nestará se o nic jiného, než aby byl řetězec zapsatelný do části URI bez změny svého významu. Děje se skoro přesně totéž, jako když pošleš formulář GETem. Takže z pohledu serveru zůstane konec řádku koncem řádku, lomítko lomítkem, uvozovka uvozovkou, apostrof apostrofem. Co s tím dál dělá server a jak (či jestli) vrací ten GET parametr uživateli, to už není starost JS. |
||
peta Profil |
#17 · Zasláno: 14. 3. 2008, 13:20:18 · Upravil/a: peta
Petroff
toto jsem kdysi delal http://www.volny.cz/peter.mlich/Pr/URLchars.htm kdyz ti nestaci vysvetleni na dane strance To, co popisujes je problem textoveho retezce obecne, problem slashes, nema to nic spolecne s URL \\ \' \" \n \r \t \s pokud chces mit \n v retezci je nutne pouzit alert("\\n") alert("\n") alert("\\") alert("\"") |
||
Petroff Profil |
#18 · Zasláno: 15. 3. 2008, 08:33:38 · Upravil/a: Petroff
<To Chamurappi>
Tudíž na straně serveru musíš nahradit zpětná lomítka za „\\“, konce řádků za „\n“ a uvozovky za „\"“. Tohle je klíčová info, díky. Jsem v php zelenáč a konverze mi nakonec vyšla dost neohrabaně: ----------------------------------------------------------------- <?php function konv($s) { $new = ""; for($i=0;$i<strlen($s);$i++) { $o=ord($s[$i]); $new.=($o==10)?"\\n":(($o==92)?"\\\\":(($o==34)?"\\\"":$s[$i])); }; return $new; } /******* Já pochopitelně data uložím do DB a z té je načtu a sestavím $ pro EL.innerHTML. Zkusil jsem nahradit znaky \n řetězcem "<br />", funguje to ale zabírá víc místa v DB. *******/ $text = htmlspecialchars($text); $text= str_replace(array("\r\n","\n"),"<br />",$text); /**** nelze použít nl2br, protože nechci mít quli přehlednosti HTML kodu navíc znaky \n ****/ mysql_query("INSERT INTO komentare VALUES ('', '$meno', '$text', ......)"); $vysledek=mysql_query("select * from komentare"); $html=""; while ($zaznam=MySQL_Fetch_Array($vysledek)): $html="($zaznam[3])<strong>$zaznam[1]</strong><p>$zaznam[2]</p>\n" . $html; /* \n jen quli přehlednosti HTML kodu */ endwhile; $html = konv($html); ?> updateHTML("<?= $html ?>"); //alert("<?= $html ?>"); ------------------------------------------------------------ (při načtení stránky sestaví HTML php skript jez účasti JS) (dále při vyp.JS: form POST >> replace \n "<br />") |
||
Časová prodleva: 16 let
|
0