Autor Zpráva
moldow
Profil *
Dobry den, priamo na stranke PHP je uvedeny tento priklad:
http://php.net/manual/en/function.substr-replace.php#19015

<?
$oRIGINAL = "BritneySpears";
$sHORTER = substr_replace($oRIGINAL, '...', 10);
echo ($sHORTER);
?>

Da sa to upravit tak, aby script nebral len napevno 10 znakov, ale dynamicky spocital pocet znakov v premennej $oRIGINAL a na zaklade toho odrezaval napr. vzdy len posledne 3 znaky?

Dakujem.
Tori
Profil
mb_strlen pro zjištění délky řetězce, mb_substr pro oříznutí, výpustku (= trojtečku) pak přidáte normálně spojením řetězců.
juriad
Profil
Ano, když změníš 10 na hodnotu -3, tak nahradí poslední tři znaky.
If start is negative, the replacing will begin at the start'th character from the end of string.

A ano, můžeš si vymyslet libovolné pravidlo; třeba můžeš hledat mezery, počítat slova, počítat věty...
moldow
Profil *
Ok, v realnej situacii to mam zapisane nasledovne:

$bid->user_name = substr_replace($bid->user_name, '***', 1, 3);

Vysledok teraz je takyto:

Frantisek -> F***tisek
Juro -> J***
Maximilian -> M***milian

Ja ale potrebujem spocitat znaky v mene a
- ak ich je 1 az 4 tak necha len prve pismeno a zvysne 3 znaky nahradi s *
- ak ich je viac ako 4 tak necha prve a posledne pismene a zvysne znaky nahradi *


Vysledok potom:

Frantisek -> F*******k
Juro -> J***
Maximilian -> M********n
lionel messi
Profil
moldow:
a ale potrebujem spocitat znaky v mene a
- ak ich je 1 az 4 tak necha len prve pismeno a zvysne 3 znaky nahradi s *
- ak ich je viac ako 4 tak necha prve a posledne pismene a zvysne znaky nahradi *
$mena = array("František", "Juro", "Maximilián",);
foreach ($mena as $meno)
{
  if (strlen($meno) < 5)
  {
    $meno = substr_replace($meno, "***", 1, 3);
  }
  
  else
  {
    $meno = substr_replace($meno, "***", 1, strlen($meno) - 2);
  }
  
  echo $meno; //vypíše J*** F***k, M***n
}
Tori
Profil
lionel messi:
No a teď si to zkuste se jmény Řehoř a Váňa...
lionel messi
Profil
Tori:
No a teď si to zkuste se jmény Řehoř a Váňa...
mb_substr som nepoužil zámerne, pretože ho ani moldow nepoužil, zrejme teda nebude nutné (nemusí používať UTF-8) alebo mi ešte niečo iné uniklo?
Ak áno, potom sa ospravedlňujem, ale vo svojom výtvore vidím ako hlavný nedostatok to, že pri zadaní Maximilián nevráti M********n, ale iba M***n.
lionel messi
Profil
lionel messi:
vo svojom výtvore vidím ako hlavný nedostatok to, že pri zadaní Maximilián nevráti M********n, ale iba M***n.
Toto by sa možno dalo upraviť nejako takto, hoci popísané riešenie je zrejme nič-moc:
$mena = array("František", "Juro", "Maximilián",);
foreach ($mena as $meno)
{
  if (strlen($meno) < 5)
  {
    $meno = substr_replace($meno, "***", 1, 3);
  }
  
  else
  {
    $nahradenie = "";
    for ($i = 1; $i < (strlen($meno) - 2); $i++)
    {
      $nahradenie .= "*"; //cyklus za každé písmeno, kt. budeme nahradzovať vygenerujeme jednu hviezdičku
    }
    $meno = substr_replace($meno, $nahradenie, 1, strlen($meno) - 2);
  }
  
  echo $meno; //vypíše J*** F***k, M*********n
}



Varianta UTF-8, vyhodil som prvú podmienku, pretože keď by sme mali meno Ján, chceme J*n a nie J***n:
$mena = array("František", "Juro", "Maximilián",);
foreach ($mena as $meno)
{
    $nahradenie = "";
    for ($i = 1; $i < (mb_strlen($meno) - 2); $i++)
    {
      $nahradenie .= "*"; //cyklus za každé písmeno, kt. budeme nahradzovať vygenerujeme jednu hviezdičku
    }
    $meno = mb_substr($meno, 0, 1) . $nahradenie . mb_substr($meno, -1, 1); //k prvému písmenu pridáme nahradenie a posledné písmenko
  
  echo $meno; //vypíše J*** F***k, M*********n
}
Tori
Profil
Možná jednodušší místo cyklu použít str_repeat, počet opakování se snadno dopočítá:
mb_internal_encoding('UTF-8');
$mena = array("František", "Juro", "Maximilián", 'Jan', 'Řehoř', 'Váňa');
foreach ($mena as $meno)
{
    $ln = mb_strlen($meno);
    $repeat = $ln > 4 ? $ln - 2 : 3;
    $nahrazeni = mb_substr($meno, 0, 1) . str_repeat('*', $repeat) . ($ln > 4 ? mb_substr($meno, -1) : '');
    
    echo '<br>', $meno, ' -- ', $nahrazeni;
}
moldow
Profil *
Dakujem velmi pekne za pomoc, teraz uz presne viem co mam robit.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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