Portál AbcLinuxu, 5. května 2025 18:48

Dotaz: Náhrada řetězde preg_replace_callback nefunguje

6.1.2020 15:08 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Náhrada řetězde preg_replace_callback nefunguje
Přečteno: 497×
Odpovědět | Admin
Dobrý den. Mořím se tady s kouskem kódu, který se nechová podle očekávání, a nevím proč.

729 if( $debug ) trigger_error( '$replace: '.hppre($replace) );
$replace = preg_replace_callback('/=([0-9a-f]{2})/i',
	function($matches)use($debug){
732		if( $debug ) trigger_error( 'konverze : '.$matches[1].' na '.hexdec($matches[1]).' - '.chr(hexdec($matches[1])) );
		return chr(hexdec($matches[1]));},

	
	$replace);
736 if( $debug ) trigger_error( '$replace: '.hppre($replace) );
naplácal jsem tam triggery, abych odsledoval stavy proměnných ( xdebug nemám, neumím , no... ) a výstup je tento :
 time :+ 0,2523 s : USER : V souboru /data/srv/www/sqmail/functions/mime.php na řádce 729
$replace:

Marie Kratochv=EDlov=E1

.
time :+ 0,2523 s : USER : V souboru /data/srv/www/sqmail/functions/mime.php na řádce 732
konverze : ED na 237 - í.
time :+ 0,2523 s : USER : V souboru /data/srv/www/sqmail/functions/mime.php na řádce 732
konverze : E1 na 225 - á.
time :+ 0,2523 s : USER : V souboru /data/srv/www/sqmail/functions/mime.php na řádce 736
$replace:

.

Čili z $replace zůstane jen nový řádek ( podle všeho ).

Když modifikuji callback funkci, aby vracela jen hexdec($matches[1]), tak to funguje, samozřejmě v stringu jsou sprostá čísla, ale převod vrací výraz, kde je vidět, že se vstupem se něco - podle očekávání - dělo. Funkce chr to ale zabije a výsledkem je prázdný string. Mám tu php7.? na ubuntu bionic. Čumím na to už tři hodiny, a nevidím nic, co by mně navedlo k opravě tohoto kousku kódu.

hppre je moje funkce uzavírající print_r( cosik, 1 ) do <pre> tagu ...

Mimochodem jde o knihovnu z Squirrellmailu. ( no, nebudete věřit, ale naše starší kolegyně nechtějí jiný, ač jim nabízím přejít na mnohem funkčnější Roudcube ... ) to jen tak mimochodem.

Děkuji předem za nasměrování k řešení uvedeného problému.

Milan.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

6.1.2020 17:37 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Náhrada řetězde preg_replace_callback nefunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vyzkoušej funkci quoted_printable_decode().

BTW: nemáš tam náhodou problém s indexy? V PHP jsou od nuly...
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
6.1.2020 17:49 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Náhrada řetězde preg_replace_callback nefunguje
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ještě jeden poznatek: Nikde neuvádíš kódování. String je zřejmě v ISO-Latin-2 nebo ve Windows-1250, ale PHP7 má defaultní sadu UTF-8.
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
6.1.2020 18:34 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: Náhrada řetězde preg_replace_callback nefunguje
Jaký význam má kódováni ? preg_replace zajímá kódování ?

Ten kód převádí QP "escapované" znay do bytestringové podoby. Pokud by preg_replace fungoval v multibyte, pak by ho to mohlo rozhodit, to ano, a taky by to vysvětlovalo, proč při vyhození char() přece jen výstup nějaký byl ... ale zkoušet můžu až zítra.

V tom programu se nastavuje setlocale na češtinu cs_CZ.UTF8 ( tedy dle configu ) někde brzy ze začátku ..

Nevím, co mám zkusit ?
Řešení 1× (Milan Uhrák (tazatel))
6.1.2020 23:56 Kit | skóre: 45 | Brno
Rozbalit Rozbalit vše Re: Náhrada řetězde preg_replace_callback nefunguje
echo iconv('windows-1250', 'UTF-8', $replace);
Komentáře označují místa, kde programátor udělal chybu nebo něco nedodělal.
8.1.2020 12:15 Milan Uhrák | skóre: 31 | blog: milan_at_ABC
Rozbalit Rozbalit vše Re: Náhrada řetězde preg_replace_callback nefunguje
Abych své hodnocení ( řešení ) vysvětlil, to, co tiskl print_r bylo jen nereprezentovatelné, proto netiskl nic. strlen( $replace ) ale hodil 19, čili jsem celou dobu bloudil v mlhách omylu.

Děkuji za nakopnutí.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.