Jednoduchý výraz pro oříznutí začátku stringu

scientific
Člen | 93
+
0
-

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)

stepos2
Člen | 51
+
+1
-
substr($item->path, strrpos($item->path, "/www") + 4 - strlen($item->path));
Ondřej Kubíček
Člen | 494
+
+1
-

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 | 93
+
0
-

@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@OndřejKubíček

Děkuji Vám ještě jednou.

Editoval scientific (10. 9. 2020 15:42)

dakur
Člen | 493
+
+1
-

@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 | 93
+
0
-

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)