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)
ale jak odstraním poslední znak když nikdy není stejně dlouhý název obrázku?
Taps
Profil
leorond:
a co pomocí funkce strlen, ta dokáže spočítat počet znaků
leorond
Profil
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
leorond:
Proč to neudělat pomocí reguláru?
anonymníí
Profil *
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 substru 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á strposu), 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
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
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
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
Co když cesta k obrázku nebude poslední atribut?
<img src=bla/bla/obrazek.jpg class="mujObrazek">
Nebo budeš chtít mít cestu v uvozovkách.
<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 *
Dan Charousek:
Hodnota atributu může být i v apostrofech.
Dan Charousek
Profil
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*/ }
Všimni si prvního parametru funkce preg_match: ~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']
Pomocí funkce 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
Děkuji Dan Charousek :)

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0