Autor Zpráva
maarlin
Profil
Zdravím,
mám v databázi uložených několik regulárních výrazů a tyto výrazy potřebuju tahat z databáze a používat je ve funkci preg_replace, potíž je v tom že PHPko to z databáze chápe jako obyčejný text a funkce preg_replace to nepochopí a buď se neprovede vůbec nebo se ta fce provede nějak jinak, než by měla.
Pravděpodobně se musí ta hodnota vytažená z databáze ještě nějak zpracovat - přetypovat, změnit interpretaci, či co já vím...
Bohužel netuším, jak to udělat, abych zfunkčnil ty regulární výrazy tahané z databáze.
Asi to bude podobný postup, jako když potřebuju sečítat čísla tahaná z databáze, kde jsou třeba jako VARCHAR() a jediné co bych s tím udělal je vynásobil jedničkou...

Díky za rady.
bukaj
Profil
maarlin
PHPko to z databáze chápe jako obyčejný text a funkce preg_replace to nepochopí a buď se neprovede vůbec nebo se ta fce provede nějak jinak, než by měla.
Pokud vím, tak PHP všechno z databáze (bohužel včetně čísel) ukládá jako řetězec, takže by neměl být problém.

V manuálu sice je psáno, že první argument - regulární výraz - fce preg_replace() je typu mixed, ale to neznamená, že nepřijímá řetězec (string). Mixed značí, že parametr může být více typů (viz pseudo-typy). Takže např. v případě preg_replace() může být prvním argumentem řetězec nebo pole řetězců.

Taky je možnost, že jsem vůbec nepochopil, v čem vlastně tkví tvůj problém.
krteczek
Profil
Myslím že tady bude problém ve slashování řetězců... nech si vypsat, co ti leze z te databáze, prostě si ty reguláry echni místo toho abys je použil a budeme vědět...
maarlin
Profil
Tak jsem zjistil, že problém není přímo v regulárních výrazech tahaných z databáze, ale spíše v druhém parametru fce preg_replace - tedy replacement. Dosazuji třeba \\1 - když potřebuji dostat z reguláru první subvýraz, přesto, že PHPko vypíše obsah proměnné jako \\1, ve skutečnosti (asi kvůli bezpečnosti) do fce dosazuje něco jiného, totiž výstupem funkce je vždy "\1" tedy jedno zpětné lomítko a jednička. druhé lomítko se kamsi vytratilo.
Když totiž druhý parametr dosadím nezávisle na databázi - napíšu ho tam přímo, tak funkce pracuje, jak má.
Tedy viděl bych možná potíž v tom, že při tahání z databáze jsou ty data prohnány nějakou escapovací funkcí, které se nelíbí ta zpětná lomítka.
Alphard
Profil
\ se používá jako součást speciálních sekvencí, např. \n,
když ho budeš chtít např. vypsat, budeš ho muset zdvojit: echo "\\"; (vypíše \) můžeš si zkusit
když chceš \\, opět je zdvojíš, echo "\\\\";
maarlin
Profil
Alphard: Díky za radu, tohle mě nenapadlo... :)

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: