Autor Zpráva
krteczek
Profil
Dobrý den, jde pomocí PCRE funkcí zjistit délka řetězce? ověřit délku pomocí preg_match umím, potřeboval byc ale i zjistit jak dlouhý ten řetězec je...
ověření délky řetězce (proty co to zajímá):

function porovnej_delku_retezce($text, $max_delka)
{
$vzor = '#^((.){0,' . $max_delka . '})$#u';
return (preg_match($vzor, $text) ? false : true);
}


//použití:
echo (porovnej_delku_retezce($text, 25) === false) ? "retezec je příliš dlouhý" : "délka řetězce je v pořádku");

krteczek
Alphard
Profil
nestačilo by strlen?
http://cz.php.net/manual/cs/function.strlen.php
Eddie
Profil
dlzku retazca zistis pomocou fce strlen();
krteczek
Profil
no to sice jo jenze u utf-8:
strlen("žžžžžž") != 6
mb_strlen("žžžžžž", "utf8") == 8 ale není dostupné všude :-( takže hledám řešení jak to udělat
Alphard
Profil
možná tohle: :-)
echo strlen(iconv("UTF-8", "ISO-8859-2", "žžžžžž"));
Acci
Profil
krteczek
mb_strlen je v PHP už od verze 4.0.6, s tím by snad neměl být nikde problém.
D1ce
Profil
Acci
To ano, ale všude přeci není povolená.
krteczek
Tadu je co jsem zbastlil:

/**
* Vraci skutecnou delku retezce
* bacha funguje jen na utf-8
* nejdriv retezec rozsekame na znaky
* do pole a to potom spocitame
* pomoci fce count()
* a protoze preg_split() vraci chybu,
* pokud retezec konci "\r" nebo "\n"
* je tam ten zavinac na potlacovani chyb
* @param string $str retezec na pocitani delky
* @return int delka retezce
*/
function preg_strlen($str) {
return count(@preg_split('//um', $str, -1, PREG_SPLIT_NO_EMPTY));
}

$str = '
fgfdg^%^*&
6587ěšřščř
žčšžřý df
gds safdas
čžřščžžž'."\n".'
dsfds žžžžř
čž ščřč'."\r";

echo preg_strlen($str).'<br>';
echo strlen($str).'<br>';
echo mb_strlen($str, 'utf-8').'<br>';
echo (15+6*10). ' = Skutecna velikost(pocitano rucne) <br><br>';

$str = 'žžž '."\n";

echo preg_strlen($str).'<br>';
echo strlen($str).'<br>';
echo mb_strlen($str, 'utf-8').'<br>';
echo (5).' = Skutecna velikost(pocitano rucne) <br><br>';

Avšak co me děsí je, že každá fce vrací jiný počet znaků. A rada na závěr? Používejte preg_strlen(), protože ta jediná vrací správný počet znaků. Howg.
DoubleThink
Profil *
Používejte preg_strlen(), protože ta jediná vrací správný počet znaků.
Obávám se, že naopak.

Pojďme to rozebrat.
strlen() neuvažuji - unicode řetězce počítá špatně, to je všeobecně známo (počítá každý byte).
mb_strlen() to spočítal správně, pokud pracuješ ve Windowsu - ten má jak známo konec řádku \ r \ n, tedy 2 znaky.
preg_strlen() to spočítal špatně, protože konce řádků jsou plnohodnotné znaky a ve scriptech je s nimi počítáno.
D1ce
Profil
DoubleThink
mb_strlen() to spočítal správně, pokud pracuješ ve Windowsu - ten má jak známo konec řádku \r\n, tedy 2 znaky.
Ano mb_strlen() to spočítal správně, ale přeci jste se sekl mistře. :P
Windowsu - ten má jak známo konec řádku \r\n
Ale ne-e tak je to na *nixu, Widle mají \n\r ! představte si. Taty je opravená fce preg_strlen():

/**
* Vraci skutecnou delku retezce
* bacha funguje jen na utf-8
* @param string $str retezec na pocitani delky
* @return int delka retezce
*/
function preg_strlen($str) {
$len = substr_count($str, "\n");
$len += substr_count($str, "\n");
$str = str_replace(array("\n", "\r"), '', $str);
return ($len + count(preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY)));
}

$str = '
fgfdg^%^*&
6587ěšřščř
žčšžřý df
gds safdas
čžřščžžž'."\n".'
dsfds žžžžř
čž ščřč'."\r";



echo preg_strlen($str).'<br>';
echo strlen($str).'<br>';
echo mb_strlen($str, 'utf-8').'<br>';
echo (83). ' = Skutecna velikost(pocitano rucne) <br><br>';

$str = 'žžž '."\n\r\n\r";

echo preg_strlen($str).'<br>';
echo strlen($str).'<br>';
echo mb_strlen($str, 'utf-8').'<br>';
echo (8).' = Skutecna velikost(pocitano rucne) <br><br>';

Jinak díky moc za upozornění. Sám bych na to nepříšel. :) A doporučení? Use preg_strlen(); . *THUMBS_UP*
tiso
Profil
D1ce
<CR><LF> - DOS + Windows
<LF> - Unix
<CR> - MAC
llook
Profil
Jenom doplním:
<CR> = \r = HEX 0D = DEC 13
<LF> = \n = HEX 0A = DEC 10

Schválně si zobraz hexadecimálně nějaký textový soubor, v těch okenních najdeš nové řádky jako sekvenci 0D 0A (tj. \r\n) a v unixových pouze 0A (tj. \n). Ono se to týká spíše aplikací než OS, ale většinou se tato konvence dodržuje.

Jak je to na Macu nevím, protože v současnosti Apple vyrábí cosi, co lze označit za PC, Mac i Unix zároveň. Ale dříve tam bylo zažité <CR>, tedy \r.
krteczek
Profil
Pro všechny: Díky za tipy, rady i řešení, krteczek
D1ce
Profil
Velice se omlouvám za zpoždění, ale pokušel jsem se z moderátorem diskuse domluvit na opravě editace, která mi bohužel nefunguje.
Tadytohle by měla být finální, doufám, že konečně 100% funkční verze:

/** * Vraci skutecnou delku retezce * bacha funguje jen na utf-8 * @param string $str retezec na pocitani delky * @return int delka retezce */ function preg_strlen($str) { $len = substr_count($str, "\n") + substr_count($str, "\r"); $str = str_replace(array("\n", "\r"), '', $str); return ($len + count(preg_split('//u', $str, -1, PREG_SPLIT_NO_EMPTY))); } $str = ' fgfdg^%^*& 6587ěšřščř žčšžřý df gds safdas čžřščžžž'."\n".' dsfds žžžžř čž ščřč'."\r"; echo preg_strlen($str).'<br>'; echo strlen($str).'<br>'; echo mb_strlen($str, 'utf-8').'<br>'; echo (83). ' = Skutecna velikost(pocitano rucne) <br><br>'; $str = 'žžž '."\n\r\n\r"; echo preg_strlen($str).'<br>'; echo strlen($str).'<br>'; echo mb_strlen($str, 'utf-8').'<br>'; echo (8).' = Skutecna velikost(pocitano rucne) <br><br>';
Toto téma je uzamčeno. Odpověď nelze zaslat.