Autor Zpráva
Sylar
Profil
Zdravím,
snažím se vymyslet regulární výraz, který by měl nahrazovat čárku s mezerou za enter (\n), ale pouze mimo závorku.

Vymyslel jsem toto, ale nenahrazuje to správně.
$string = "abc, def (aaa, bbb, ccc), hij, klm";
preg_replace("/[^(](\w)+, (\w)+[^)]/", "$1\n$2", $string); // nový $string by měl vypadat takto "abc\ndef (aaa, bbb, ccc)\nhij\nklm"

Dokázal by mě někdo popostrčit?
Tori
Profil
Např. preg_replace_callback, vytáhnete si jen části mimo závorky a v callback funkci nahradíte str_replace.


Vlastně stejný princip, jaký jste asi nakonec použil i v tomhle případě: Regulární výraz - sjednocení více mezer mimo tag pre
juriad
Profil
Nahraď /,(?=[^)]*$|[^)]*\(.*)/ za \n, další podmínka není nutná. Za předpokladu, že výraz je správně uzávorkovaný a neobdahuje závorky uvnitř závorek.

Rexeg testuje jestli za čárkou existuje nějaká zavírací závorka, pokud ne, je jasné, že můžeme dělit, pokud ano a před ní existuje otevírací závorka, taktéž můžeme dělit. Jediný případ, kdy test selže, je, pokud následuje zavírací závorka, která nebude otevřena => jsme uvnitř závorek.


Testoval jsem v perlu na vstupu: "abc, def (aaa, bbb, ccc), hij, (a,b,c), klm, as", dávalo to výstup:
"abc
 def (aaa, bbb, ccc)
 hij
 (a,b,c)
 klm
 as"
Sylar
Profil
Tori:
zkoušel jsem to nějak přes ten preg_replace_callback(), ale nedaří se mi to udělat "rekurzivně" pro vícero závorek.

S tím <pre> jsem to nakonec dělal úplně jinak :)

juriad:
díky, to je skvělé.
Tori
Profil
echo preg_replace_callback('~(?<=^|\)).+?(?=\(|$)~', function($m) { return str_replace(',', "\n", $m[0]); }, $string);
Ale řešení od juriada se mi líbí víc.

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: