PHP: Nahrazení řetězce dle pravidla
Regulární výrazy byly vždycky můj kámen úrazu. Byl bych tedy moc rád, kdyby mi někdo dokázal pomoct.
Potřeboval bych převést řetězec podle následujících pravidel:
Jedná se o text složen s více slov, ale tak že nejsou použity mezery a další slovo vždy začíná velkým písmenem:
např. "StabilizerEffect"
Já potřebuji tento řetězec převést na malá písmena (což samozřejmě umím), ale navíc ještě přidat podtržítka tam kde má být jakoby mezera.
Podle předchozí příkladu má tedy vzniknout "stabilizer_effect".
Aby to však nebylo jednoduché, tak může dojít k situaci, kdy je více velkých písmen za sebou, které se jen přehodí na malé.
např. "RadiationUVAandUVB" -> "radiation_uva_and_uvb"
Pak může ještě nastat dokonce toto: "IndexEEIEffect" -> "index_eei_effect"
Byl by někdo schopen na toto napsat nějaký nahrazovací regulární výraz?
Re: PHP: Nahrazení řetězce dle pravidla
Nema ten druhy priklad byt RadiationUVAAndUVB ?
Re: PHP: Nahrazení řetězce dle pravidla
pokud ma monsoon pravdu, tak by mohlo fungovat
PHP kód:
preg_replace("/([A-Z]+)/","_\$1",$kde);
strtolower($kde);
(strelba od boku)
pokud pravdu nemam ... tak to budes mit docela tezky. budes muset najit nejakej klic, podle kteryho to rozdelit ...
Re: PHP: Nahrazení řetězce dle pravidla
Máte pravdu, že by to tak skutečně mělo být, nicméně není - s tím už já nic neudělám. Leda říct pánům na druhé straně.
Fox:
Díky moc, zítra to hned v práci zkusím.
Re: PHP: Nahrazení řetězce dle pravidla
Pokud to tak neni, tak to nemas sanci regularnim vyrazem napsat, jedine jestli slova, jez zacinaji malym, jsou nejak omezena, ale obecne bohuzel.
Re: PHP: Nahrazení řetězce dle pravidla
Fox:
Tak jsem to konečně otestoval a výsledek je to příkladu následující (bez zmenšení znaků) - _Index_EEIEffect.
Chtělo by to tedy ještě říct, aby dával podtržítka před ty velká písmena, za kterými buď následují další velká písmena, nebo před ty, za kterými je hned malé písmeno. Pokud to tedy bude možné :)
Re: PHP: Nahrazení řetězce dle pravidla
nojo, to jsem nedomyslel.
tohle bude asi trosku prasecky, ale fungovat by to teoreticky mohlo
PHP kód:
preg_replace("/([A-Z][a-z])/","_\$1",$kde);
preg_replace("/([a-z])([A-Z])/","\$1_\$2",$kde);
tohle by melo hodit podtrzitko vsude tam kde je zmena z velkejch na maly a z malejch na velky ...
Re: PHP: Nahrazení řetězce dle pravidla
Skvělé a bylo by možné ještě nějak ošetřit, aby se to podtržítko nedávalo i na začátek?
Re: PHP: Nahrazení řetězce dle pravidla
guessing...
PHP kód:
preg_replace("/(.)([A-Z][a-z])/","\$1_\$2",$kde);
preg_replace("/([a-z])([A-Z])/","\$1_\$2",$kde);
Re: PHP: Nahrazení řetězce dle pravidla
Skvělé, takhle to funguje.
Díky moc.