Autor Zpráva
pike.0
Profil *
Ahoj. Prosil bych o pomoc s regulárním výrazem majícím nahradit či spíše z výsledného textu úplně vymazat řetězec $retezec před kterým se ale nenachází tečka. $retezec může být ve tvaru "dada.dasdaQW.SA...".
Fungovat by to mělo takto:
$retezec="nejaky.retezec";
$text="daq dda dasq dad q,nejaky.retezec"; // z tohoto textu by to mělo odstranit $retezec
$text="daq dda dasq dad q.nejaky.retezec"; // z tohoto textu to nesmí odstranit $retezec, protože se před ním nachází tečka
AM_
Profil
pike.0:
Prosil bych o pomoc s regulárním výrazem
nejsme továrna na regulární výrazy.
Pokud se zasnažíš a hodíš sem nějaké své nefunkční řešení, ze kterého bylo vidět, že jsi se snažil ale něco nechápeš, pomůžeme ti se reguláry naučit. Ale nějak nevidím důvod za tebe odvádět práci od začátku do konce.
pike.0
Profil *
Zkoušel jsem:
preg_replace("#[^\.]".$retezec."[\.]#U", '', $text);
preg_replace("#[!\.]".$retezec.".#U", '', $text);
preg_replace("#[^\\.]".$retezec."\.#U", '', $text);
preg_replace("#[^\\.]".$retezec."\.$#U", '', $text);
...
Majkl578
Profil
Pokud dosazuješ vlastní hodnoty přímo do reguláru, měl bys je escapovat, zároveň se tu hodí aserce:
preg_replace('~.(?<!\.)' . preg_quote($retezec, '~') . '~U', '', $text);
AM_
Profil
a) stringy reprezentující regulární výrazy ZÁSADNĚ zapisuj do apostrofů ' ', ne do uvozovek "", jinak skončíš v escapovacím pekle.
b) pokud se v $retezec nachází tečka jako znak, musíš ji taky oescapovat, t.j.
$retezec='nejaky\.retezec';

jinak to tam vezme libovolný znak.

c)
preg_replace("#[^\.]".$retezec."[\.]#U", '', $text);

tady mi přijde, že se snažíš najít $retezec, před kterým není tečka, ale za ním je. resp. nechápu, proč tam máš tu zatučněnou část (na několik způsobů).

d) pokud bude nejaky_retezec na začátku stringu, tak ho to nesmaže (není předcházen znakem, který by nebyl tečka - není předcházen totiž žádným znakem). Řeší se to pomocí lookahead a lookbehind, nějak takto:
preg_replace('#(?<!\.)'.$retezec.'#', '', $text);

jinými slovy, toto opravdu říká "$retezec, který není předcházen tečkou", nikoli jako původní verze "$retezec předcházený jiným znakem než tečka".

e) nevím, proč tam máš modifikátor U (ungreedy), když ve výrazu nemáš ani jeden kvantifikátor. Ničemu to neublíží, jen to zhoršuje čitelnost kódu.

//edit: pozdě, ale zase jsem to zplodil v obsáhlejší a naučnější verzi :D
pike.0
Profil *
$text = preg_replace('/(?<!\.)'.preg_quote($retezec, '/').'\./', '', $text);

funguje jak potřebuju. Děkuju. Problémový by byl příkaz preg_replace('/.(?<!\.)'..., protože nahrazoval i to co jsem nechtěl.
pike.0
Profil *
Mohli byste mě ještě prosím odkázat na nějaký manuál toho co přesně dělá ta špičatá závorka "<"? V manuálech jsem to nějak nenašel.
__construct
Profil
Speciální závorkové konstrukce
AM_
Profil
pike.0:
kdyby sis přečetl můj příspěvek, odkaz bys tam našel. Ale proč číst dlouhé a poučné řešení, když to někdo zpracoval za tebe...
pike.0
Profil *
tvůj příspěvek jsem prostudoval, ale to za d) jsem totiž pochopil jinak - tak že to slouží za nahrazování pouze něčeho co se nachází na začátku nějakého stringu.
AM_
Profil
pike.0:
ale to za d) jsem totiž pochopil jinak

toto opravdu říká "$retezec, který není předcházen tečkou"
a navíc tam bylo napsané úplně to samé (?<!\.), tak mi přišlo jasné, k čemu to patří, ale pokud to jasné není, tak se omlouvám.

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: