Regulární výraz
11 příspěvků
Archiv diskusního fóra
Fórum je uzavřené a slouží pouze ke čtení. Některé informace mohou být zastaralé.
-
Potřeboval bych regulární výraz, který by nahradil v řetězci všechny & za &, ale ne už © za &copy; POSIX zvládám jen v základech. Napsal jsem toto, ale není to moc ideální: EReg_Replace('&^(([A-Za-z]{2,6}|(#[0-9]{2,3}));)', '&', $string); Nezvládnete to někdo v PCRE? Na php.net jsem našel toto, ale ani nevím, jestli je to správně. PReg_Replace('/&(?![A-Za-z0-9]{0,4}\w{2,3};|#[0-9]{2,3};)/', '&', $string); Musí to počítat s: - všechny možné délky < ð ï ê è - čísla ½ - zápis pomocí ASCII kódu  (?)  { - možná ještě něco (?) Díky, Pavel
-
Fakt to nikdo neví?
-
-
Moc Tě nechápu, jestli chceš jen ten jeden znak &, tak napiš ERegI_Replace('[[:<:]]&[[:>:]]', '&', $string);
-
2Bery: Ne, nechci jen ten jeden znak &. Určitě víš, že některé znaky se ve validním html nesmějí vyskytovat jako prostý text - smějí jen tehdy mají-li nějaký specilání význam, jako např. < >. Když jsou ale součástí prostého textu, musí být nahrazeny html-entitami. Nejtapičtější jsou právě případy: < < > > <a href="skript.php?param1=1&param2=2"> Takovéto změny umí funkce HTMLSpecialChars() HTMLEntities(), já mám napsánu funkci vlastní, ale to na problému nic neřeší. Uživatel mi zadá data a já v nich nhradím všechny tato znaky příslušnými entitami. Potud je to správně. Když však zadá např. © funkce nahradí znak & ya &, tedy z © bude &copy. Proto bzch chtěl ošetřit případ, kdy za & následuje zbytek enitity. Tehdy se & nahradit nemá.
-
to chces se mi zda sice dost nejasne... jak chces poznat jestli je za & nejaka entita? budto bude za & mezera a tudis by to bylo snadne nebo tam mezera nebude,nebude to entita a my nepozname nic. takze pokud nemas seznam entit stery by jsi vypisoval tak to nepujde. a tim ASCII kodem uz to pomoci RE udelat samozrejme jde
-
2Master: Jasně, ale mi stačí vědět, že se jedná "přibližně" o entitu. Pravděpodobnost, že mi některý uživatel při pasní článku pošle obyčejný text &nesmyslna_enita; je mizivá. Na druhou stranu je velmi pravděpodobné, že když pošlě ©, chce, aby se mu vypsal © a ne &copy; Ošetřit jen ascii-kodove varianty enit ztrácí účel... Mů regulární výraz by měl nahrazovat asi takto: Nahraď & za & jen v případě, že nenásleduje: [a-zA-z0-9]{2,8}; // nevím jistě, jeslti 2-8, zatím stačí jen přibližně nebo #[0-9]{2,5}}; // nevím jistě, jeslti 2-4, opět zatím jen přibližně nebo ještě něco jiného, co jsem opomenul (?) Jak jsem napsal, našel jsem na php.net tento PCRE PReg_Replace('/&(?![A-Za-z0-9]{0,4}\w{2,3};|#[0-9]{2,3};)/', '&', $string); Ale PCRE moc neznám, takže mě v něm některé části jako ? ! \w matou.
-
tak proc to nepouzijes ? nejede to?
-
Ne úplně, nějak to blbne. Projedu tím řetěžec "Chtěl bych, aby mi to vypsalo © &a & &hb_fask?bf;" a vyjde mi z toho "Chtěl bych, aby mi to vypsalo © &a & &hb_fask?bf;" Tedy zadané entity to nechalo tak, jak má (nezměnilo na &copy;). Naopak to ale nezaměnilo &a za &a a &hb_fask?bf; za &hb_fask?bf;". Jak říkám, PCRE příliš nerozumím. Jasně že chápu {0,4}, [A-Za-z0-9] atd., ale některé znaky mi nic neříkají. Teď navíc bohužel nemám čas to dostudovat. V POSIXU umím trochu lépe, ale zasekl jsem se na (nejspíš klíčovém) příkazu NOT. Nevím, jak zapsat "cokoliv jiného, než následující". Zápis "^(([A-Za-z]{2,6}|(#[0-9]{2,3}))" patrně nebude správný, pač mi nefunguje.
-
Ještě jednou a pochopitelnějším způsobem: Projedu tím řetěžec "Chtěl bych, aby mi to vypsalo © &a ∓amp; &hb_fask?bf" a vyjde mi z toho "Chtěl bych, aby mi to vypsalo © &a ∓amp; &hb_fask?bf" © a & nechá správně stejné. &a a &hb_fask?bf by měl nahradit za &a a &hb_fask?bf, což ale neudělá.
-
a co takhle: if (!eregi("&([^;]{2,6})|(#[0-9]{2,3})", $text, $reg)) { neni to entita, muzeme to zmenit.... } ted ale presne nevim jestli & neni nejaky vyznamovy znamenko v RE ... jestli jo dej: \&