Autor Zpráva
Ofi
Profil
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"
a výsledek byl
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"
dostal toto
"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
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
S modifikátorem U, tj. celé:
#(?<!\\)(['"])(.*)(?<!\\)\1#U
Tohle by mohlo fungovat.
Ofi
Profil
Joker:
Díky, vyzkouším to.
Majkl578
Profil
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
Majkl578:
Výborně! Díky moc, to je přesně to co jsem potřeboval. Děkuji oběma smz. :)
Joker
Profil
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
Joker:
Asi jo, takže upravit co jsem poslal na něco jako:
preg_replace('~(?<!\\\\)(["\']).+(?<!\\\\)\\1~Us', ...
Čímž jsme se skoro dostali k tomu co jsi psal už ty.

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:

0