PHP funkce

HackForum

PHP funkce#
Ahoj! Mam nasledujici funkci v PHP, ktera "vysaje" text, ktery je mezi dvema retezci. Ptam se Vas, zda nevite jak funkci optimalizovat, aby byla rychlejsi, pripadne mate nejake efektivnejsi reseni teto situace? Dekuji

function vysaj($zacatek,$konec,$text)
{
$delka=strlen($zacatek);
$text = StrStr($text, $zacatek);
$text=substr($text,$delka);
$pomocnej=StrStr($text, $konec);

return str_replace($pomocnej,"",$text);
}

(odpovědět)
Aoj | 82.27.163.*2.4.2013 0:52
re: PHP funkce#
Zkus použít regulární výraz:

function vysaj2($zacatek,$konec,$text) {
preg_match("/^($zacatek)(.+)($konec)$/", $text, $output);
return $output[2];
}


----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP2.4.2013 19:02
re: PHP funkce#

function vysaj3($begin, $end, $text)
{
$t = strpos($text, $begin) + strlen($begin);
return substr($text, $t, strpos($text, $end) - $t);
}

(odpovědět)
independent | E-mail2.4.2013 20:30
re: PHP funkce#
Dekuju moc!! otestuju a urcite dam vedet! ;)
(odpovědět)
Aoj | 82.27.163.*3.4.2013 1:44
re: PHP funkce#
@.cCuMiNn.: Vaše řešení bych rozhodně nedoporučoval. Testoval jste ho, co se do rychlosti a funkčnosti(undefined index notice) týče?
Řešení od independenta je určitě lepší volbou.
(odpovědět)
mb0y | E-mail3.4.2013 6:32
re: PHP funkce#
mb0y:
1) pro ošetření funkčnosti stačí dopředu inicializovat pole $output[].

2) možná se budete divit, ale mé řešení je skutečně nejrychlejší, a to zhruba v tomto poměru:
- vysaj1() : 10
- vysaj2() : 7
- vysaj3() : 8

----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP3.4.2013 8:35
re: PHP funkce#
Kdyz jsem to posilal, chtel jsem to zmerit taky, ale ta funkce vysaj2() mi prave nejak nechtela fungovat a protoze mam s regexama minimum zkusenosti, nevedel jsem, jak to opravit (a nevim to do ted).

Aoj to podle me chce pouzivat na vyparsovani textu mezi tagy a imho by moje reseni skutecne melo byt nejrychlejsi. Ten preg_match imho bude prochazet cely text a hledat vsechny vyskyty, zatimco strpos se u prvniho vyskytu zastavi. Zvlaste u delsich textu by rozdil mohl byt markantni. Mozna se ale pletu.

vysaj2 mi hazi nasledujici error:
Notice: Undefined offset: 2


Inicializovat pole tedy nestaci, protoze ten preg_match tam proste zadny vysledek neulozi.
(odpovědět)
independent | E-mail3.4.2013 16:53
re: PHP funkce#
OK, omlouvám se a beru zpět. Někde se vloudil nějaký šotek a fn 2. je skutečně nejpomalejší.

výsledek testu:
TRUE testy
1: 00:02 - Vrací: " dlouheho textu a jeho "
2: 00:05 - Vrací: " dlouheho textu a jeho "
3: 00:02 - Vrací: " dlouheho textu a jeho "

FALSE testy
1: 00:02 - Vrací: ""
2: 00:03 - Vrací: ""
3: 00:02 - Vrací: "tek dlouheho textu a jeho k"


----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP3.4.2013 21:09
re: PHP funkce#
Kód:
<?php
function vysaj1($zacatek,$konec,$text) {
$delka=strlen($zacatek);
$text = StrStr($text, $zacatek);
$text=substr($text,$delka);
$pomocnej=StrStr($text, $konec);
return str_replace($pomocnej,"",$text);
}

function vysaj2($zacatek,$konec,$text) {
preg_match("/^($zacatek)(.+)($konec)$/", $text, $output);
return isset($output[2])?$output[2]:'';
}

function vysaj3($begin, $end, $text) {
$t = strpos($text, $begin) + strlen($begin);
return substr($text, $t, strpos($text, $end) - $t);
}

$zacatek = "zacatek";
$konec = "konec";
$text = "zacatek dlouheho textu a jeho konec";

echo "<h2>TRUE testy</h2>";
$time = Time();
for ($i=0; $i<500000; $i++) {
$a = vysaj1($zacatek, $konec, $text);
}
echo "<b>1: </b>".StrFTime("%M:%S", Time()-$time)
.' - Vrací: "'.vysaj1($zacatek, $konec, $text).'"<br><br>';

$time = Time();
for ($i=0; $i<500000; $i++) {
$a = vysaj2($zacatek, $konec, $text);
}
echo "<b>2: </b>".StrFTime("%M:%S", Time()-$time)
.' - Vrací: "'.vysaj2($zacatek, $konec, $text).'"<br><br>';

$time = Time();
for ($i=0; $i<500000; $i++) {
$a = vysaj3($zacatek, $konec, $text);
}
echo "<b>3: </b>".StrFTime("%M:%S", Time()-$time)
.' - Vrací: "'.vysaj3($zacatek, $konec, $text).'"<br><br>';


$zacatek = "blaf";
$konec = "blaf";
$text = "zacatek dlouheho textu a jeho konec";

echo "<h2>FALSE testy</h2>";
$time = Time();
for ($i=0; $i<500000; $i++) {
$a = vysaj1($zacatek, $konec, $text);
}
echo "<b>1: </b>".StrFTime("%M:%S", Time()-$time)
.' - Vrací: "'.vysaj1($zacatek, $konec, $text).'"<br><br>';

$time = Time();
for ($i=0; $i<500000; $i++) {
$a = vysaj2($zacatek, $konec, $text);
}
echo "<b>2: </b>".StrFTime("%M:%S", Time()-$time)
.' - Vrací: "'.vysaj2($zacatek, $konec, $text).'"<br><br>';

$time = Time();
for ($i=0; $i<500000; $i++) {
$a = vysaj3($zacatek, $konec, $text);
}
echo "<b>3: </b>".StrFTime("%M:%S", Time()-$time)
.' - Vrací: "'.vysaj3($zacatek, $konec, $text).'"<br><br>';
?>


----------
Teprve když vstáváte s hackingem a uléháte s myšlenkou na něj, máte šanci být hackerem.
(odpovědět)
.cCuMiNn. | E-mail | Website | PGP3.4.2013 21:30
re: PHP funkce#
[code=php]
/**
* Vysává ze zadaného textu část mezi dvěma definovanými řetězci
* V případě, že je nalezen text začínající a končící požadovanými
* řetězci, je navrácen.
* Je hledán pouze první výskyt - zleva doprava, nebo zprava doleva ($rtl).
*
* @param string $zacinaNa Řetězec, kterým začíná text
* @param string $konciNa Řetězec, kterým končí hledaný text
* @param string $text Text ve kterém se hledá
* @optional boolean $rtl Pokud je true, hledá od konce
* @return string|boolean V případě nalezení požadovaných řetězců vrátí text mezi, jinak vrací false
*/
function vysaj4($zacinaNa, $konciNa, $text, $rtl = false)
{
// hledání zleva doprava nebo zprava doleva?
$fce = $rtl ? "strrpos" : "strpos";

// zkusíme najít start
$ret = $fce($text, $zacinaNa) + strlen($konciNa);

if($ret === false){
return false;
}

return substr($text, $ret, $fce($text, $konciNa) - $ret);
}

(odpovědět)
mb0y | E-mail4.4.2013 8:38
re: PHP funkce#
WOW!! Naprosto vyčerpávající!! Nečekal jsem tolik odpovědí. Nakonec dost zajímavé!
Oceňuji vaši iniciativu!!
Díky moc!:)
(odpovědět)
Aoj | 82.27.163.*7.4.2013 1:48

Zpět
 
 
 

 
BBCode