Autor Zpráva
Vanama
Profil
Zdravím,
peru se teď s jedním výrazem a nemůžu to rozlousknout. Regulerní výrazy mi prostě nejdou.

Potřeboval bych najít všechny asi hex znaky ve stringu - např. \x26, \x3d, \x22, ... - a nahradit je "normálním" znakem.

Na převod mi funguje chr(hexdec('\x26'));, ale nevím jak to udělat regulerním výrazem všude ve stringu.

Napsal jsem toto, ale něco je tam stále špatně.

		$data = preg_replace(
            '~(\x..)~',
            'chr(hexdec($1))',
            $data);
 
 		echo preg_last_error();
Majkl578
Profil
Vanama:
ale něco je tam stále špatně
Jistěže.
1) Potřebuješ preg_replace_callback, ne preg_replace.
2) Při splnění 1) by ti to nefungovalo - vracel by se ten kus kódu jako string. Řešil by to příznak e (eval), ale to není vhodné.

Funkční by to bylo za použití nahrazení callbackem takto:
$data = '\x26\x3d\x22';

 $data = preg_replace_callback('~\\\\x(..)~', function ($m) {
    return chr(hexdec($m[1]));
}, $data); 

 echo $data;
Vanama
Profil
Tuhle funkci jsem taky zkoušel, ale evidentně byla chyba v tom regulárním výrazu. Všude se sice dočtu jak psát regulární výrazy, ale nikde jsem se nedočetl co použít na začátku. Z různých příkladů někde používají na začátku a na konci # nebo / a nebo jak to mám já ~.

Díky moc, vaše řešení je funkční.
Majkl578
Profil
Vanama:
Z různých příkladů někde používají na začátku a na konci # nebo / a nebo jak to mám já ~.
Ono je to totiž jedno. Podle dokumentace to smí být cokoliv kromě alfanumerických znaků a zpětného lomítka. Nicméně nejčastnější bývá lomítko (/), hash (#), tilda (~) nebo zavináč (@). Obecně se nehodí takové znaky, které ve výrazu používáš (např. zpětné lomítko pro výraz na URL), protože je to kontraprodutivní - musí se navíc escapovat.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0