Autor Zpráva
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

Ahoj, nezakládám zbytečně nové téma, ale píšu sem.
Mám problém se zapsáním reguláru (vč správných php funkcí) pro nahrazopvání . v názvu nahrávaného souboru. Chci tedy ošetřit jména souborů nahraných na web (ve windows se může soubor jmenovat a.b.c.a.přípona, ale na webu to dělá bordel. Takže potřebuju najít poslední tečku před příponou a ostatní tečky před ní nahradit _ (popř jiným, to si spravím sám). Kdyby někdo měl, hodila by se ui nějaká rozsáhlejší funkce na úpravu názvů souborů pro web.

Předem díky
Petr
SwimX
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

matlala:
jednu takovou "rozsáhlejší funkci" bych měl :D
$jmeno = str_ireplace(
  array("ě","š","č","ř","ž","ý","á","í","é","ů","ú"," ","-",":",",","!","?","{","}","(",")","[","]","'","*","&","^","%","$","#","@","+",";","`","~","÷","<",">","/","\\","\"","=","%20"),
  array("e","s","c","r","z","y","a","i","e","u","u","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_"), 
  $jmeno);
$jmeno = preg_replace('@\.(\.)+@','.',$jmeno); //více teček nahradí jednou
$jmeno = preg_replace('@(\.([^\.])+\.)+@U','-$2-',$jmeno); //odstraní všechny kromě poslední
  
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

díky
Majkl578
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

SwimX:
Fuj. Zkus se podívat na funkci strtr. Navíc to nefunguje.

matlala:
Hmmm, myslím, že vlastní téma sis založit měl.
$filename = 'aa.bb.cc.dd.dat';
preg_match('~^(.*)(\.[a-z0-9]+)+?$~iu', $filename, $matches);
var_dump($matches);
$filename = str_replace('.', '', $matches[1]) . $matches[2];
var_dump($filename);
Chamurappi
Profil
Reaguji na matlalu:
nezakládám zbytečně nové téma, ale píšu sem
Příště laskavě nedělej nepořádek, tvůj dotaz s tím předchozím nijak nesouvisel.
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

ale funguje, jen byli blbě pojmenované proměnné, jinak nemohl bys dodat i poznámky, co udělá co?
Majkl578
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

matlala:
Asi jsi se nepodíval pořádně, ale jeho kód nahrazuje i poslední tečku.
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

aha, jsme to pořádně nezkusil, zkoušel sjem jen diakritiku a spešl znaky. lae trocha jsme to upravil a hodil do funkce:
function NazvySouboru($vstup){
$filename=strtolower($vstup);
$jmeno = str_ireplace(
  array("ě","š","č","ř","ž","ý","á","í","é","ů","ú"," ","-",":",",","!","?","{","}","(",")","[","]","'","*","&","^","%","$","#","@","+",";","`","~","÷","<",">","/","\\","\"","=","%20"),
  array("e","s","c","r","z","y","a","i","e","u","u","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_"), 
  $filename);//nahradí diakkritiku a podbné vč mezer
$jmeno2 = preg_replace('@\.(\.)+@','.',$jmeno); //více teček nahradí jednou
$jmeno3 = preg_replace('@(\.([^\.])+\.)+@U','-$2-',$jmeno2); //odstraní všechny kromě poslední
$nahrazeno=eregi_replace("_+", "_", $jmeno3);//odstraní přebytečné _
return $nahrazeno;
}


odskoušel jsem to nahráním souboru s původním názvem GB s.r.o a soubor se přejmenoval na gb_s-r-o.doc, taky jsem zkusil ěščřžýáýíšééáíšříé´=#&@.gif a předělané jméno je escrzyayiseeaisrie´_.gif
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

proč to tu furt mažete, může se to někomu přeci jen hodit, takže to vzdávám, admine, který to mažeš sbohem, tady snad nekdy přestanu z takovou chodit
Chamurappi
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

Reaguji na matlalu:
Nemažeme. Přesouváme.

Řešíte-li jiný problém než tazatel, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky.
— To jsi četl, ne?

admine, který to mažeš sbohem
Nazdar.
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

OT:jo už jo, aspon napiš kam jsi to přesunul, ja su uplně zmatenej (oprava, měls napsat dříve kam to šopls)
PS:zkuste zavést aspon OT, ikdyž tohle saotné je OT :-D

Moderátor Chamurappi: V horním menu máš odkaz „Můj profil“, přes který si můžeš všechny své aktivity dohledat, ať jsou kdekoliv.
matlala
Profil
Moderátor Chamurappi: Přesunuto z Reguláry (pro fuckina :D).

OT: jo vim,že je můžu dohledat, jen dneska sjme dost ve spěchu, a nějak to tu ani nikdy nehledám.
matlala
Profil
aha no fakt to nahrazuje i poslední, ale jen když to zkusím vypsat:
$vstup="aa.bb.cc.dd.dat";
echo NazvySouboru($vstup);

vypíše aa-b-cc-d-dat, jinak to soubory nechává pojmenované dobře, viz celý script, možná je někde nějaká věc co to zmemožní

function NazvySouboru($vstup){
$filename=strtolower($vstup);
$jmeno = str_ireplace(
  array("ě","š","č","ř","ž","ý","á","í","é","ů","ú"," ","-",":",",","!","?","{","}","(",")","[","]","'","*","&","^","%","$","#","@","+",";","`","~","÷","<",">","/","\\","\"","=","%20"),
  array("e","s","c","r","z","y","a","i","e","u","u","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_","_"), 
  $filename);
$jmeno2 = preg_replace('@\.(\.)+@','.',$jmeno); //více teček nahradí jednou
$jmeno3 = preg_replace('@(\.([^\.])+\.)+@U','-$2-',$jmeno2); //odstraní všechny kromě poslední
$nahrazeno=eregi_replace("_+", "_", $jmeno3);//odstraní přebytečné _
return $nahrazeno;
}

function nahrajsoubor($textpole,$popisekpole){
$set=mysql_fetch_array(mysql_query("SHOW TABLE STATUS LIKE 'soubory'"));
$cilo=$set['Auto_increment'];
$nazevSouboru = $_FILES[$textpole]['tmp_name'];
$filename = $_FILES[$textpole]['name'];//Původní jméno souboru, strtolower převede na malá písmena
$soubor = NazvySouboru($filename);
$konecnyNazevSouboru=$cilo."_".$soubor;
$cil = SOUBORY."/".$konecnyNazevSouboru;
$copy = move_uploaded_file($nazevSouboru, $cil) or die ("Přenesené soubory nelze zkopírovat");
$popis=$_POST[$popisekpole];
chmod ($cil, 0777); 
if($copy == true){ 
$NazevSouboru_db=$soubor;
$datetime=time();
mysql_query("INSERT INTO soubory (nazev, popis, datetime) VALUES ('$NazevSouboru_db', '$popis', '$datetime')");
}else{
echo "Soubory nemohly být nahrány.\nPočet chyb: " . $_FILES[$textpole]['error'];
}
}


if(isset($_POST["uloz"])){
if (!empty($_FILES['fupload']['name']) and $_FILES['fupload']!="none")
{
nahrajsoubor("fupload","popis");
if (!empty($_FILES['fupload2']['name']) and $_FILES['fupload2']!="none")
{
nahrajsoubor("fupload2","popis2");
if (!empty($_FILES['fupload3']['name']) and $_FILES['fupload2']!="none")
{
nahrajsoubor("fupload3","popis3");
}
}
}
header("location: ".HTTP."/admin.php?akce=soubory");
}


no a tohle:
$filename = 'aa.bb.cc.dd.dat';
preg_match('~^(.*)(\.[a-z0-9]+)+?$~iu', $filename, $matches);
var_dump($matches);
$filename = str_replace('.', '', $matches[1]) . $matches[2];
var_dump($filename);
echo $filename;

mi zas vypíše array(3) { [0]=> string(15) "aa.bb.cc.dd.dat" [1]=> string(11) "aa.bb.cc.dd" [2]=> string(4) ".dat" } string(12) "aabbccdd.dat" aabbccdd.dat
matlala
Profil
jo ha var_dump vypíše co se provádí. Takže bez var_dump to vypíše pouze hodnotu.
Takže tak jo bez výpisu co se děje (var_dump)? mě to funguje a upraví to:
$filename = 'aa.bb.cc.dd.dat';
preg_match('~^(.*)(\.[a-z0-9]+)+?$~iu', $filename, $matches);
var_dump($matches);
$filename = str_replace('.', '', $matches[1]) . $matches[2];
var_dump($filename);
echo $filename;


Mohl by mi ten regulár někdo pořádně vysvětlit, vůbec nevím co to má znamenat na konci ~iu? to vyhledá příponu?
Majkl578
Profil
matlala:
To jsou modifikátory výrazu. i je case-insensitive a u je podpora unicode.

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: