Autor | Zpráva | ||
---|---|---|---|
leorond Profil |
Ahoj potřeboval bych vypsat část řetězce z mysql ale neznám pravou délku, vlastně je ta délka vždy jiná.
Uvedu příklad, dejme tomu že chci z <img src=bla/bla/obrazek.jpg> vybrat třeba jen ten obrazek.jpg
Vím že to udělám funkcí substr
substr($row1["name"],17) |
||
Taps Profil |
#2 · Zasláno: 12. 11. 2015, 00:32:40
leorond:
a co pomocí funkce strlen, ta dokáže spočítat počet znaků |
||
leorond Profil |
#3 · Zasláno: 12. 11. 2015, 01:57:27
No zkusil jsem to nějak takhle i když to není zrovna košér tak funguje jak má.
$obr = substr($row1["name"],9); $obr1 = substr($obr,0,-1); echo $obr1; |
||
Dan Charousek Profil |
#4 · Zasláno: 12. 11. 2015, 07:59:10
leorond:
Proč to neudělat pomocí reguláru? |
||
anonymníí Profil * |
#5 · Zasláno: 12. 11. 2015, 10:05:55
leorond:
A tu devítku znáš? Pokud ano, tak to jde zkrátit na $obr = substr($row['name'], 9, -1); Jinak můžeš hledat pomocí funkce strrpos poslední lomítko (funkce vrací číslo, které pak použiješ jako první argument u substr u místo devítky).
Dan Charousek: Pravděpodobně jako začátečník regulární výrazy nezná. Ale elegantní a snadné řešení jde i za pomoci substr (a možná strpos u), které není nikterak složité, dlouhé a navíc by mělo být rychlejší. Při jednom průběhu pochopitelně nerozeznatelné, ale začátečník v něm pak provede snadno jakékoliv úpravy snáze.
|
||
Bertram Profil |
leorond:
<?php $obr = "<img src=bla/bla/obrazek.jpg>"; $obr2 = "<img src=bla/bla/dalsiBLA/obrazek.jpg>"; // pro $obr echo substr($obr, 17, -1); echo "<br />"; echo substr(strrchr($obr, "/"), 1, -1); echo "<br />"; echo substr($obr, strrpos($obr, "/")+1, -1); echo "<br />"; echo "<br />"; // pro $obr2 echo substr($obr2, 17, -1); echo "<br />"; echo substr(strrchr($obr2, "/"), 1, -1); echo "<br />"; echo substr($obr2, strrpos($obr2, "/")+1, -1); // výstup obrazek.jpg obrazek.jpg obrazek.jpg dalsiBLA/obrazek.jpg obrazek.jpg obrazek.jpg |
||
mimochodec Profil |
#7 · Zasláno: 12. 11. 2015, 12:15:58
Jestli máš jistotu, že u toho obrázku je uvedena i nějaká cesta:
$in = "<img src=bla/bla/obrazek.jpg>"; $out = end (explode ("/", $in)); $out = str_replace (">", "", $out); |
||
leorond Profil |
#8 · Zasláno: 12. 11. 2015, 16:51:21
Děkuji všem za pomoc :) mimochodec tvoje řešení se mi líbí, anonymníí vím co kde použít ale s některými výrazy potřebuji trošku pomoci abych věděl že jsem to udělal správně a zda to nejde lépe.
|
||
mimochodec Profil |
#9 · Zasláno: 12. 11. 2015, 17:12:51
Ještě mě napadlo miniaturní opatření, které ošetří situace, kdy by náhodou ta cesta, resp. lomítko, před obrázkem nebyla.
$in = "<img src=bla/bla/obrazek.jpg>"; $in = str_replace ("=", "/", $in); $out = end (explode ("/", $in)); $out = str_replace (">", "", $out); |
||
Dan Charousek Profil |
#10 · Zasláno: 12. 11. 2015, 18:00:31
Co když cesta k obrázku nebude poslední atribut?
<img src=bla/bla/obrazek.jpg class="mujObrazek"> <img src="bla/bla/obrazek.jpg" class="mujObrazek"> S tím regulárem to nemusí být ani tak násilné: $str = '<img src="bla/bla/obrazek.jpg" class="mujObrazek">'; preg_match('~src="?([^>" ]*)"?~', $str, $matches); $temp = explode("/", $matches[1]); echo end($temp); |
||
leorond Profil |
Dan Charousek popiš mi trochu druhý skript z [#10], vypadá to jako zajímavé řešení ovšem dejme tomu že by obrázek byl vždy bez znaků jako jsou uvozovky.
Vím že $str = '<img src="bla/bla/obrazek.jpg" class="mujObrazek">'; /* Z čeho se bude vybírat část řetězce */ preg_match('~src="?([^>" ]*)"?~', $str, $matches); /* co se při výpisu vynechá */ $temp = explode("/", $matches[1]); /* znak od kterého se bude vypisovat? */ echo end($temp); /* samotný výpis */ Zajímal by mne 2. a 3. řádek abych v to pořádně chápal a mohl to použít v praxi vždy když budu potřebovat. Také se mi moc líbí stránka Živá ukázka ale neznáte někdo něco podobného pro PHP? Případně jak se v tomto dá pracovat s PHP? |
||
anonymníí Profil * |
#12 · Zasláno: 12. 11. 2015, 19:01:46
Dan Charousek:
Hodnota atributu může být i v apostrofech. |
||
Dan Charousek Profil |
#13 · Zasláno: 12. 11. 2015, 19:59:24
anonymníí:
„Hodnota atributu může být i v apostrofech“ $str = '<img src=\'bla/bla/obrazek.jpg\' class="mujObrazek">'; preg_match('~src=["\']?([^>\'" ]*)["\']?~', $str, $matches); $temp = explode("/", $matches[1]); echo end($temp); Sice projde i nevalidní <img src='bla/bla/obrazek.jpg" class="mujObrazek"> , ale to snad není zas tak velký problém.
leorond: „popiš mi trochu druhý skript z“ $str = '<img src="bla/bla/obrazek.jpg" class="mujObrazek">'; // 1) preg_match('~src="?([^>" ]*)"?~', $str, $matches); // 2) $temp = explode("/", $matches[1]); // 3) echo end($temp); // 4) 1) vstupní řetězec 2) preg_match patří do rodiny funkcí preg_* Tato konkrétní funkce vrací true nebo false, podle toho, zda kontrolovaný text (druhý parametr) odpovídá reguláru - vzoru (prvnímu parametru). Regulární výraz je řetězec jako každý jiný, ale ve funkcích preg_* má svou speciální syntaxi a význam. Více se o nich dočteš zde. Zjednodušeně: Pomocí regulárního výrazu dokážeš zjistit, zda tebou kontrolovaný text odpovídá nějakému vzoru. Existuje celá sada speciálních znaků, pomocí kterých toho docílíš. Např.: tečka . odpovídá jakémukoliv znaku, hvězdička * je takzvaný kvantifikátor a říká, že daný znak (znak, za kterým se nachází) se může vyskytovat kolikrát je libo (i 0x).
Pokud bych chtěl např. zjistit, zda kontrolovaný text odpovídá vzoru a.*b kontroloval bych to funkcí preg_match následujícím způsobem:
$kontrolovanyText = "aSTROMb"; // tento text bude odpovídat if(preg_match("~a.*b~", $kontrolovanyText)) { // shoda } else { /* neshoduje se*/ } ~a.*b~ . Těmi vlnovkami se nemusíš moc zabývat. Stačí vědět, že se jedná o znaky, mezi které se samotný regulární výraz uzavírá (nemusí to být jen vlnovky, v PHP lze použít celou řadu těchto oddělovačů - delimetrů - např.: lomítko / ). Tomuto vzoru odpovídají všechny řetězce, které obsahují libovolně dlouhý text (.* - tečka znázorňuje libovolný znak, hvězdička znázorňuje libovolný počet opakování), který je ohraničený písmeny a a b .
Třetí parametr funkce preg_match, je nepovinný a - jednoduše řečeno - obsahuje nalezené shody. Na nultém indexu je nalezená shoda a na následujících indexech je shoda s takzvanými sub-pattern (pod-vzory). Pokud tě nezajímá jen to, zda text zadanému výrazu odpovídá, ale i to, jaký konkrétní text se nachází na konkrétních místech textu, můžeš využít takzvané sub-patterny. Stačí jen uzavřít daný vzor do kulatých závorek: $text = "aSTROMb"; if(preg_match("~a(.*)b~", $text, $shody)) { // text odpovídá vzoru a ještě si můžeme vypsat o jaký text se jedná: echo $shody[0]; // vypíše celý řetězec: aSTROMb echo $shody[1]; // vypíše shodu odpovídající prvnímu sub-patternu - (.*) vypíše: STROM } Podobného principu využívám v kroku 2) 3) nyní jsem pomocí regulárního výrazu získal text následující po textu src= (jedná se o zjednodušení, jinak je to trochu složitější, ale jak vlastně celý, mnou uvedený, regulár funguje se můžeš dočíst na výše uvedených stránkách) a vím, že se jedná o první sub-pattern, takže pracuji s $matches[1] .
Ve třetím kroku pomocí funkce explode() rozdělím získaný text do pole podle lomítka: / (to abych se zbavil cesty, která předchází samotnému názvu souboru).
4) V posledním kroce si vezmu pole, které mi vzniklo v kroce 3 předpokládejme, že jsem pomocí explode rozděloval podle lomítka text aaa/bbb/obrazek.jpg
Dostal jsem tedy pole ['aaa', 'bbb', 'obrazek.jpg'] end přesunu ukazatel na poslední prvek pole (hledaný název obrázku) a pomocí echa vypíši.
Ufff... koho by bylo bývalo napadlo, že 4 řádky kódu vyžadují tolik vysvětlování. |
||
leorond Profil |
#14 · Zasláno: 12. 11. 2015, 23:52:45
Děkuji Dan Charousek :)
|
||
Časová prodleva: 8 let
|
0