Regulární výraz

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
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:
<   &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á.
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ě &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.
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 &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.
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á.
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: \&