Autor Zpráva
4ever
Profil
Existuje v php nějaká funkce, která by byla podobná strstr() příp. stristr() ale hledala by od určitého řádku?
4ever
Profil
Asi jsem našel zdrojový kód té funkce, tak možná by se dal snadno upravit regulární výraz?

http://api.joomla.org/__filesource/fsource_utf8_strings_phputf8stristr.php.html

<?php
/**
* @version $Id: stristr.php 10381 2008-06-01 03:35:53Z pasamio $
* @package utf8
* @subpackage strings
*/
 
//---------------------------------------------------------------
/**
* UTF-8 aware alternative to stristr
* Find first occurrence of a string using case insensitive comparison
* Note: requires utf8_strtolower
* @param string 
* @param string 
* @return int 
* @see http://www.php.net/strcasecmp
* @see utf8_strtolower
* @package utf8
* @subpackage strings
*/

function utf8_stristr($str, $search) {
 
    if ( strlen($search) == 0 ) {
        return $str;
   }
 
    $lstr = utf8_strtolower($str);
    $lsearch = utf8_strtolower($search);
    preg_match('|^(.*)'.preg_quote($lsearch).'|Us',$lstr, $matches);
 
    if ( count($matches) == 2 ) {
        return substr($str, strlen($matches[1]));
    }
 
    return FALSE;
}
Alphard
Profil
Dělá ta funkce něco jiného než mb_stristr()?

Soubor nenačtete z půlky, různé posuny jdou dělat s fseek(), ale vy neznáte cílovou pozici, takže k ničemu...
Prostě soubor procházejte cyklem pomocí fgets() a v daném intervalu řádků hledejte. Po projití intervalu ukončit pomocí break.
4ever
Profil
Jaký je vlastně rozdíl mezi těmi dvěmi funkcemi mb_stristr() a stristr? Jenom to přidané kódování? To kódování jsem vyřešil metodou, která mi načtený text převede na utf-8 než dojde k porovnání, takže jsem ani mb_stristr() nemusel použít. Regulární výraz, který by nejdříve vypustil určitý počet řádků něco jako

$reg_exp = /(?:.*\n){$min,$max}($search_string.*)/
respektive
$reg_exp = "/(?:.*\n){".$min.",".$max."}(".$search_string.".*)/";


(min a max jsou čísla řádků, interval)

Jedná se mi o to, že když jsem již prošel nějakou část souboru pomocí fgets() a mám to uloženo v zásobníku $buffer (nebo $contents to je jedno), současně znám aktuální řádek díky $n++ v cyklu, nemusím znova procházet to co je v zásobníku.

Příklad.
Hledám 10-100 řádků v souboru.
V zásobníku mám načteno 10-50 řádků.
$n je 50
pomocí preg_match($reg_exp, $buffer+$line, $output) bych vynechal prvních 49 řádků. A prohledal bych 49 až 50 řádek ze zásobníku + aktuální řádek.


Je jen otázka zda je ten regulární výraz realizovatelný a platný, ne příliš vytěžující a jestli je to spolehlivé.
4ever
Profil
Tak jsem to zkoušel a vyšlo mi z toho toto:

function myStrSearch($haystack, $needle, $n, $sensitive = "i") {
   $range = 2; // how many newlines has $needle?   
//    echo "<b>".$n."<br></b>";
    $regexp = "/(?m)(?:.*^){".($n-$range).",".$n."}(?:.*)(".preg_quote($needle).".*)/s";
    preg_match($regexp, $haystack, $matches);

    if (isset ($matches[1])):
//       print_r($matches);
      return $matches[1];
    endif;

    return false;
}


První část reg. výrazu říká, že se má najít a vypustit určitý počet řádků, potom následuje libovolný text, který je možno vypustit a teprve potom následuje hledaný text.

Nejsem si ji jistý za přepínač "s" je nutný, když používám (?m) víceřádkový režim. Nevím zda je to rychlejší než stristr, ale zatím se mi to nějak pomalé nejeví. Možná u většího počtu prohledávaných souborů... Měla by se ještě doplnit funkce nebo metoda někde mimo tuto funkci, která určí kolik zalomení \n obsahuje hledaný text needle a to potom předat argumentem do funkce.

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:

0