Portál AbcLinuxu, 10. května 2025 04:41
$prom1 = "neco"; $prom2_pozice = "1"; $znak1 = "S"; $znak2 = "E";a potrebuji najit v souboru cast textu, ktery podle promenych rika: budu hledat 1 text "neco" za timto textem najdu první znak S a prvni znak E a mezi temito znaky vyberu text. Vůbec nevim jak na to mam jit. Poradil by mi prosím někdo? Googloval jsem cele odpoledne ale nenasel jsem vubec nic. Dekuji za pomoc. Pepa
Řešení dotazu:
/neco.*?S(.*?)E/
function vybrat_z_textu($prom2_pozice, $prom1, $znak1, $znak2, $string)
{
// vstupni kontrola
if (strlen($prom1) < 1)
$nalez = true;
else
$nalez = false;
if (strlen($string) < 1)
return;
// zjisti delku textu
$prom_lenght = strlen($prom1);
$string_lenght = strlen($string);
// prom2_pozice by mela obsahovat cislo v poradi znaku - tedy zacni na
// patem znaku => $prom2_pozice = 5;
$i = $prom2_pozice - 1;
// probiha hledani klicove fraze $prom1 v textu
while (($nalez != true) || ($string_lenght >= ($i + 1)))
{
// pokud prvni znak klic. fraze je shodny se znakem, ktery je na rade
if ($string[$i] == $prom1[0])
{
// zjisti zdali dalsi znaky jsou shodne
$n = $i + 1;
for ($j = 1; $j <= ($prom_lenght - 1); ++$j)
{
if ($string[$n] != $prom1[$j])
break;
else
$uspech = true;
++$n;
}
// pokud jsou dalsi znaky shodne, "vrati" pozici po klic. frazi
if ($uspech)
{
$i = $n;
break;
}
}
++$i;
}
// vyhleda obe pismena
$pozice_prvniho = 0;
$pozice_druheho = 0;
while (($nalez_druheho != true) || ($string_lenght >= ($i + 1)))
{
if ($string[$i] == $znak1)
$pozice_prvniho = $i;
if ($string[$i] == $znak2)
{
$pozice_druheho = $i;
$nalez_druheho = true;
}
++$i;
}
// vybere a vrati text mezi znaky
return substr($string, $pozice_prvniho + 1,
($pozice_druheho - $pozice_prvniho) - 1);
}
// vstupni data
$prom1 = "neco";
// predpokladam ze je zde pozice, na ktere ma zacit vyhledavat
$prom2_pozice = 1;
$znak1 = "S";
$znak2 = "E";
// vstupni text
$string = "Toto je cvicny text. Jde pouze o to, aby zde program nasel
slovo Neco NECO NeCo neco (zkouska) a potom pismeno S a mezi tim ma byt text - tedy je zde.
Nyni jiz musi najit pismeno E. A je to.";
var_dump(vybrat_z_textu($prom2_pozice, $prom1, $znak1, $znak2, $string));
/* * Najde v ramci textu prvni vyskyt slova "neco" a vrati prvni podretezec, * ktery nasleduje za timto nalezem mezi pismeny "S" a "E" (bez ohledu na * spravne parovani znaku). Pokud nedojde ke shode, funkce vraci false. */ function foo($text) { $matches = array(); if (preg_match('/neco[^S]*S([^E]*)E/', $text, $matches) > 0) return $matches[1]; return false; }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.