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
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: \&