Autor | Zpráva | ||
---|---|---|---|
Ofi Profil |
#1 · Zasláno: 17. 8. 2011, 14:35:22
Zdravím,
jak byste prosím udělali regex, který by vybral všechno v uvozovkách(nebo apostrofech) včetně vyescapovaných uvozovek(nebo apostrofů) aby to vzalo "bla bla bla \" lala \' něco nic všechno" bla bla bla \" lala \' něco nic všechno resp. jde mi o to v textu vzít všechny středníky, které jsou v uvozovkách a nahradit je například znakem ~, čili abych z tohoto: "bla bla; bla \" lala \' něco nic; všechno" "bla bla~ bla \" lala \' něco nic~ všechno" s tím, že se může středník vyskytovat v textu i mimo uvozovky, a ty nahradit nechci. Vzatý text může mít x stovek i tisíců řádků, takže prosím maximálně univerzální :) děkuji |
||
Joker Profil |
#2 · Zasláno: 17. 8. 2011, 15:22:26
Ofi:
Měl by to tedy být text začínající uvozovkou před kterou není zpětné lomítko až po následující uvozovku před kterou není zpětné lomítko. A ještě apostrofy: řetězec pak může začínat buď uvozovkou nebo apostrofem, pokud předtím není zpětné lomítko, přičemž musí končit tím samým jako začal. [^\\](['"])(.*)?[^\\]\1 s modifikátorem U, aby to našlo nejkratší možný řetězec.
Zbývá jeden problém, že kvůli testu, že před uvozovkou musí být něco jiného než zpětné lomítko to vybere i jeden znak před uvozovkou a zároveň to nebude fungovat když uvozovky začínají hned na začátku textu. Takže bude potřeba použít vychytávku jménem záporné tvrzení o předcházejícím: (?<!\\)(['"])(.*)(?<!\\)\1 #(?<!\\)(['"])(.*)(?<!\\)\1#U |
||
Ofi Profil |
#3 · Zasláno: 17. 8. 2011, 15:26:06
Joker:
Díky, vyzkouším to. |
||
Majkl578 Profil |
#4 · Zasláno: 17. 8. 2011, 15:35:46 · Upravil/a: Majkl578
Ofi:
„který by vybral všechno v uvozovkách(nebo apostrofech) včetně vyescapovaných uvozovek(nebo apostrofů)“ „vzít všechny středníky, které jsou v uvozovkách a nahradit je například znakem ~“ Najde nejbližší výskyt řetězce obaleného " nebo ' až po odopovídající ukončovací znak s tím, že tento znak se uvnitř escapuje. Nakonec nahradí uvnitř středníky. $data = <<< EOS lorem ipsum "bla bla bla; \" lala \' něco nic všechno" 'foo bar "baz"; foobar' blabla; EOS; $data = preg_replace_callback('~(["\'])(?:.*).(?<!\\\\)\\1~Us', function ($m) { return str_replace(';', '~', $m[0]); }, $data); var_dump($data); Joker mě sice předběhl, ale dávám rovnou hotové řešení. Koukám, že JUSH neumí správně obarvit kód s HEREDOC. |
||
Ofi Profil |
#5 · Zasláno: 17. 8. 2011, 15:42:55
Majkl578:
Výborně! Díky moc, to je přesně to co jsem potřeboval. Děkuji oběma smz. :) |
||
Joker Profil |
#6 · Zasláno: 17. 8. 2011, 15:56:54
Majkl578:
U otevírací uvozovky by taky měla být podmínka, že před ní nesmí být zpětné lomítko, řekl bych. |
||
Majkl578 Profil |
#7 · Zasláno: 17. 8. 2011, 16:33:35 · Upravil/a: Majkl578
Joker:
Asi jo, takže upravit co jsem poslal na něco jako: preg_replace('~(?<!\\\\)(["\']).+(?<!\\\\)\\1~Us', ... |
||
Časová prodleva: 13 let
|
0