Autor | Zpráva | ||
---|---|---|---|
Sylar Profil |
#1 · Zasláno: 22. 4. 2013, 19:34:47
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 |
#2 · Zasláno: 22. 4. 2013, 19:48:44 · Upravil/a: Tori
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 |
#4 · Zasláno: 22. 4. 2013, 20:52:00
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 |
#5 · Zasláno: 22. 4. 2013, 21:01:40
echo preg_replace_callback('~(?<=^|\)).+?(?=\(|$)~', function($m) { return str_replace(',', "\n", $m[0]); }, $string); |
||
Časová prodleva: 11 let
|
0