Implementare Regex in orice fisiere de tip text (cu ajutorul PHP)

salut prieteni, incerc sa realizez un cod prin care sa execut o comanda regex in php, care sa caute si sa modice fiserele txt

aici intregul meu cod http://codepad.org/vxwlMQJ2

regexul din preg_match nu stiu de ce nu afiseaza. Extrag din link-ul de mai sus, urmatoarea bucatica de cod care cred ca nu este in regula:


$lista_fisiere = get_list_dir($cale_fisiere, false, ‘file’, true, $fisiere_excluse);

preg_match(’/(\d+)/’, $lista_fisiere, $matches);

print_r($matches);


Ce face intregul meu cod. Selecteaza fisierele, si am facut o functie prag_match ca sa introduc o ecuatie Regex oarecare. Dar daca verificati singuri intregul script, imi da eroare, ceva nu e facut cum trebuie.

daca ma poate ajuta cineva…


cc @Birkoff

asa cum ai facut tu acolo, ar trebui sa iti dea eroare la al doilea parametru pasat functiei preg_match

uite ce scrie in manualul php
http://php.net/manual/ro/function.preg-match.php

al doilea parametru trebuie sa fie un string (sir de caractere in care sa caute) nu un array.
tu pasezi un array si daia iti da eroare.
fa un foreach pentru $lista_fisiere si asa o sa mearga (atentie preg_match nu iti modifica nimic in sir, doar iti da o lista cu ce a gasit) poate ai nevoie de http://php.net/manual/ro/function.preg-replace.php

eu m-am straduit cum am putut, nu sunt in domeniu. Era frumos sa ma ajute cineva direct, daca iar sunt intors de unde am plecat n-am facut nimic.

Birkoff, e greu sa-mi fi aratat direct cum trebuia scris acea linie? Ma intorci de unde am plecat…eu trebuie sa stau o saptamana ca sa incerc ceea ce tie iti ia mai putin de 10 minute…

Te rog să citești secțiunea asta din regulament.

În cazul în care dorești doar rezolvarea, poți pune un anunț în #marketplace, astfel încât să te ajute cineva (contracost).

7 Likes

Legat de …

… mai jos este o alegorie, cu care se potriveşte foarte bine:

https://www.reddit.com/r/todayilearned/comments/2b4n7a/til_henry_ford_once_balked_at_paying_10000_to/

Henry Ford once balked at paying $10,000 to General Electric for work done troubleshooting a generator, and asked for an itemized bill. The engineer who performed the work, Charles Steinmetz, sent this: “Making chalk mark on generator, $1. Knowing where to make mark, $9,999.” Ford paid the bill.

(According to Scott, Steinmetz listened to the generator and scribbled computations on the notepad for two straight days and nights. On the second night, he asked for a ladder, climbed up the generator and made a chalk mark on its side. Then he told Ford’s skeptical engineers to remove a plate at the mark and replace sixteen windings from the field coil. They did, and the generator performed to perfection.)

1 Like

ok, Birkoff, am facut un foreach, dar imi afiseaza calea fisierelor din localhost, dar nu continutul lor

$lista_fisiere = get_list_dir($cale_fisiere, false, 'file', true, $fisiere_excluse);
foreach ($lista_fisiere as $matches) {
preg_match('/(\d+)/', $matches);
print_r($matches);}

referitor la preg-replace, am incercat o combinatie, dar nu cred ca e ok, fiindca nu-mi selecteaza nimic din continutul vreunui fisier, ci imi afiseaza calea lor si denumirea,

$lista_fisiere = get_list_dir($cale_fisiere, false, 'file', true, $fisiere_excluse);
foreach ($lista_fisiere as $matches) {
echo preg_replace(array('/(\d+)/'), '', $matches);
}

help Birkoff !

am mai incercat o varianta, dar imi da eroare la sfarsit "Parse error: syntax error, unexpected end of file in D:/localhost/uuu.php on line 154 "

$lista_fisiere = get_list_dir($cale_fisiere, false, 'file', true, $fisiere_excluse);
$array = file($$lista_fisiere, true);
foreach($array as $value)
{
    
    if(preg_match('/(\d+)/', $value))
    {
       echo array($value);
    }

intreg codul aici http://codepad.org/JQZxEkaf

in varianta de mai jos, am selectat continutul textului, dar nu-mi iese regex-ul (care trebuie sa-mi afiseze doar literele “a” si “b” din cuvintele din text.)

$lista_fisiere = get_list_dir($cale_fisiere, false, ‘file’, true, $fisiere_excluse);
$data = file_get_contents(“myfile.txt”);
preg_replace(array(‘([A-B])’), ‘’, $data);
print_r($data);

iar daca in loc de “myfile.txt” pun $lista_fisiere (ca sa afiseze continutul tuturor fisierelor) da eroare fiindca este array…

se pare ca tu nu intelegi ce face functia aia get_list_dir()
daca citeai cu atentie in tutorialul de unde ai luat functia, acolo scrie ca functia aia returneaza “lista de fisiere” cu sau fara cale (depinde ce parametrii ii dai) din directorul specificat, nu iti returneaza si continutul acelor fisiere.
Ca sa iei continutul, faci ulterior o bucla (un foreach de exemplu) si citesti continutul fisierului si il bagi intr-o variabila si apoi faci ce vrei tu cu acea variabila.
pentru citirea continutului unui fisier eu recomand file_get_contents()
daca nu te descurci, plateste pe cineva sa iti faca scriptul cum ai tu nevoie (asta daca nu vrei tu sa inveti cum se face)
cred ca si aici poti gasi persoane care iti pot face scriptul respectiv.

2 Likes

Birkoff, deocamdata folosesc programe de editare precum Notepad++, GrepWin si TextCrawler pentru Regex, merg impecabil, mai ales al treilea din ele. Doar ca eram curios daca PHP se misca mai repede in cazul a 1000 de fisiere sau mai mult.

nu sunt programator, nici nu-mi place, doar ca ma straduiesc sa vad daca imi iese un cod, cu putin ajutor. Da, pot sa vorbesc direct cu tine pentru script, si ne-am intelege la pret, doar ca astfel…imi ignor ambitia de a reusi :slight_smile:

http://php.net/manual/ro/class.recursivedirectoryiterator.php

$dir = getcwd();


    $dir_iterator = new RecursiveDirectoryIterator($dir);
    $iterator = new RecursiveIteratorIterator($dir_iterator, RecursiveIteratorIterator::SELF_FIRST);




    foreach ($iterator as $file) {


    	$path = $file;

        $str = file_get_contents($file);
    	
     	$str = preg_replace($patterns, $replacements, $str);
     	
     	file_put_contents($path, $str);
    }



    /*echo '<pre>';
    var_dump($files);
    echo '</pre>';*/

Am testat doar daca returneaza fisierele.

Nu am stat sa analizez codul lui birkoff, dar pare sa aiba lipsa functia read_info_dir, situatie in care va trebui sa ai $depth = false si iti va cauta doar in directorul in care specifici, nu va intra in subdirectoare.

function get_list_dir($path, $depth = false, $type = 'all', $inc = true, $exclude = array()) {
    // Set list
    $list = array();
    // directory element is determined depending on the operating system
    $elm = ( stristr(PHP_OS, 'win') === false ) ? '/' : '\\';
    // memorizes the current path
    $base_path = getcwd();
    // change to the path specified
    $is_changed = chdir($path);
    if ( ! $is_changed )
       return false;
    $required_path = getcwd();
    if ( ! $required_path )
       return false;
    // read path required
    $director = opendir($required_path);
    if ( ! $director ) {
       // return to the base path
       chdir($base_path);
       return false;
    }
    // reads the current directory
    $read = readdir($director);
    if ( $read === false ) {
       // return to the base path
       chdir($base_path);
       return false;
    }
    while ($read) {
       // excluding files / directories unwanted
       if (! in_array($read, $exclude) ) {
          // check what type is required
          switch($type) {
             default:
             case 'all': // returns all files and directories found
                // to memorize what is currently
                $list[] = ( $inc ) ? $required_path.$elm.$read : $read;
                // if is director and requires completion
                if ( is_dir($read) && $depth ) {
                   // browse the directory
                   $list[] = read_info_dir($read, $depth, $type, $inc, $exclude, $max);
                }
             break;
             case 'dir': // only returns the list of directories found
                // if is director
                if ( is_dir($read) ) {
                   // to memorize what is currently
                   $list[] = ( $inc ) ? $required_path.$elm.$read : $read;
                   // if requires completion
                   if ( $depth ) {
                      // browse the directory
                      $list[] = read_info_dir($read, $depth, $type, $inc, $exclude, $max);
                   } 
                }
             break;
             case 'file': // only returns the list of files found
                // check if file
                if ( is_file($read) ) {
                   // to memorize what is currently
                   $list[] = ( $inc ) ? $required_path.$elm.$read : $read;
                }
                // else if is folder and it requires completion
                elseif ( $depth ) {
                   // browse the directory
                   $list[] = read_info_dir($read, $depth, $type, $inc, $exclude, $max);
                }
             break;
          } // end switch 
       } // end exclude
       // go to next
       $read = readdir($director);
    } // end while
    // director closes
    closedir($director); 
    // returns to the initial path
    chdir($base_path);
    // return
    return $list;
 }


$excludem = array('.', '..', 'index.htm', 'index.html', '.htaccess');
 $lista = get_list_dir(getcwd(), false, 'file', false, $excludem);
 
 // afisam rezultatele gasite
 if ( is_array($lista) && count($lista) )
    foreach($lista as $file_name)
     //echo $file_name;
      $data = file_get_contents($file_name);
  
      $data = preg_replace($patterns, $replacements, $data);
  
      file_put_contents($file_name, $data);
       
 else
    echo 'nu a fost gasit nici un fisier in directorul specificat'; 

Am testat doar daca returneaza fisierele nu si daca le modifica, acolo modifici si tu.

1 Like

interesanta clasa aia din linkul dat de tine.
legat de functia mea, tutorialul e scris in 2011 ( http://www.tutorialeonline.net/ro/article/parcurgerea-iterativa-a-unui-director ) cand php 4 era in voga si php 5 inca nu aparuse :wink:

PHP 5 a aparut in 2004. Iar in 2011 era deja PHP 5.3
http://php.net/releases/

2 Likes