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é.

  1. Potřeboval bych regulární výraz, který by nahradil v řetězci všechny & za &, ale ne už © za © 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
  2. Fakt to nikdo neví?
  3.  
  4. Moc Tě nechápu, jestli chceš jen ten jeden znak &, tak napiš ERegI_Replace('[[:<:]]&[[:>:]]', '&', $string);
  5. 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: <   &lt; >   &gt; <a href="skript.php?param1=1&amp;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ř. &copy; funkce nahradí znak & ya &amp;, tedy z &copy; bude &amp;copy. Proto bzch chtěl ošetřit případ, kdy za & následuje zbytek enitity. Tehdy se & nahradit nemá.
  6. 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
  7. 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ě &copy;, chce, aby se mu vypsal © a ne &amp;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 &amp; 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.
  8. tak proc to nepouzijes ? nejede to?
  9. 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 &amp;copy;). Naopak to ale nezaměnilo &a za &amp;a a &hb_fask?bf; za &amp;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.
  10. Ještě jednou a pochopitelnějším způsobem: Projedu tím řetěžec "Chtěl bych, aby mi to vypsalo &copy; &a &mp;amp; &hb_fask?bf" a vyjde mi z toho "Chtěl bych, aby mi to vypsalo &copy; &a &mp;amp; &hb_fask?bf" &copy; a &amp; nechá správně stejné. &a a &hb_fask?bf by měl nahradit za &amp;a a &amp;hb_fask?bf, což ale neudělá.
  11. 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: \&

← Zpět na všechna témata