Autor | Zpráva | ||
---|---|---|---|
pike.0 Profil * |
#1 · Zasláno: 1. 11. 2010, 22:36:13
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 |
#2 · Zasláno: 1. 11. 2010, 22:43:05
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 * |
#3 · Zasláno: 1. 11. 2010, 23:19:50
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 |
#4 · Zasláno: 1. 11. 2010, 23:28:49
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 |
#5 · Zasláno: 1. 11. 2010, 23:29:59 · Upravil/a: AM_
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 * |
#6 · Zasláno: 2. 11. 2010, 09:47:30
$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 * |
#7 · Zasláno: 2. 11. 2010, 09:59:36
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 |
#8 · Zasláno: 2. 11. 2010, 10:16:12
|
||
AM_ Profil |
#9 · Zasláno: 2. 11. 2010, 16:16:50
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 * |
#10 · Zasláno: 2. 11. 2010, 19:59:31
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 |
#11 · Zasláno: 2. 11. 2010, 20:21:52
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. |
||
Časová prodleva: 13 let
|
0