Jednoduchý výraz pro oříznutí začátku stringu
- scientific
- Člen | 94
Ahoj všem, prosím o kontrukci, po někoho, kdo to umí zřejmě jednoduchého regulárního výrazu, já nejsem schopný RE vůbec pochopit, úplně se mi hnusí se to učit. Tak kdyby to bylo tak jednoduché, jak si myslím a našel by se někdo hodný. Děkuji moc.
Mám:
{$item->path}
// /var/www/html/domain.example/web/www/images/gallery/3_preview.png
Chci něco jako:
{$item->path | replaceRE (pattern, replace = ‚abrakadabra ořízni
správně předek‘)}
// /images/gallery/3_preview.png
Mělo by to až v latte, protože do prezenteru model jen načítá 1:1 výstup z DB. Případně by to mohl být řešeno v SQL dotazu. To už je asi jedno. Při nejhorším na to udělám zvlášť metodu, která bude podle ID načítat jen path a bude to řešit PHP přes něco jako explode().
Cíleně bych to chtěl přes RE, aby to bylo obecné, protože cesta může být i jiná. Obecně ale platí, že OŘÍZNOUT ZAČÁTEK řetězce, který KONČÍ na POSLEDNÍ „/www“ a to VČETNĚ.
Editoval scientific (10. 9. 2020 12:39)
- Ondřej Kubíček
- Člen | 494
a měl bys to mít v tom modelu, at to máš na jednom místě, v šabloně to budeš chtít vypsat na několika místech a budeš pak všude psát replace?
- scientific
- Člen | 94
@stepos2 : to posíláš řešení v PHP, je v pořádku, ale
preferoval jsem spíše latte/SQL, děkuji ti ale
@OndřejKubíček : Dobrý myšlenka, ale já si na tohle moc nehraju,
dělám věci, tak jak jsou pro mě momentálně nejjednodušší, než abych se
zaobíral hodinu něčím jen protože je to o kapku lepší cesta. Načítá
se to jen na třech místech, takže mi to nevadí řešit v latte.
@FVesely : Za regex, děkuji, ale už jsem to vyřešil přes SQL.
@všichni: vyřešil jsem to přes SQL, ale došlo mi, že chci vlastně potřebuji adresář souboru, nikoliv soubor.
SUBSTRING_INDEX(path, '/www', -1) AS path,
Stávající stav
{$item->path}
/images/gallery/3_preview.png
Potřebuji
{$item->path}
/images/gallery/
Tzn: potřebuji oříznout konec, který je za posledním lomítkem.
Možná řešení:
- Doplněním mého SQL (toto bych nejraději)
- Nějak otočit RE od @FVesely a použít latte filtr s RE
{$item->path | replaceRE (pattern, replace = ‚abrakadabra ořízni správně předek‘)}
Podařilo se mi udělat regex? který je téměř řešením, akorát mi to krade i koncové lomítko:
.*\/www(.*)(.*)\/.*
https://regex101.com/r/UnLktK/2
- V nejhorším případě bych to musel řešit přes PHP podobně jako poslal @stepos2 a @OndřejKubíček
Děkuji Vám ještě jednou.
Editoval scientific (10. 9. 2020 15:42)
- dakur
- Člen | 493
@scientific
Podařilo se mi udělat regex? který je téměř řešením, akorát mi to krade i koncové lomítko
On ho nekrade, jen tím, co uzavřeš do kulatých závorek, říkáš, co
z toho chceš dostat. Takže (.*)\/
ti v případě
/abcd/
vypíše /abcd
, kdežto (.*\/)
ti
vypíše /abcd/
.
https://regex101.com/r/UnLktK/6 Znamená to: najdi cokoliv, pak lomítko, pak www, pak cokoliv a končí to lomítkem (to zároveň ulož na výstup) a pak už zbytek.
Já regexp nejdřív taky moc nechápal, ale člověk se k tomu prokouše, aby to mohl aspoň nějak použít..
Editoval dakur (10. 9. 2020 15:56)
- scientific
- Člen | 94
Vyřešil jsem to jak jsem chtěl SQL dotazem:
SUBSTRING_INDEX(TRIM(TRAILING SUBSTRING_INDEX(path, '/', -1) FROM path), '/www', -1) AS path,
Díky všem.
Editoval scientific (10. 9. 2020 16:03)