Estrapolare stringhe da una funzione

  • Creatore Discussione Creatore Discussione marcomg
  • Data di inizio Data di inizio

marcomg

Utente Attivo
19 Nov 2011
204
0
16
Diciamo che il abbia un file php piuttosto complesso che sia simile a questo:
PHP:
<?php
strana_funzione('asdrubalino');
strana_funzione("vincenzino");
echo(strana_funzione("pinco").strana_funzione('pallino'));
?>

Mi servirebbe un file php che leggendo il file precedente sia in grado estrapolare tutte le stringhe che si trovano in strana_funzione("qualcosa"); o strana_funzione('qualcosa'); e le inserisca in un array. Sapete come potrei fare? E nel caso ci fosse un escape esempio strana_funzione("qualcosa: \" ahahah \"")?

Grazie!
 
Ciao,
a me è venuto in mente questo
PHP:
<?php

$file = "nome_file.php";
$array = array();

// primo ciclo per apici doppi
$fr = fopen($file, 'r');
while (!feof($fr)) {
    $riga = fgets($fr);
    $inizio_ricerca = "(\"";
    $fine_ricerca = "\")";
    $inizio = strpos($riga, $inizio_ricerca);
    $fine = strpos($riga, $fine_ricerca);
    $chr_da_estrarre = $fine - $inizio;
    $parola = substr($riga, $inizio, $chr_da_estrarre);
    $parola = str_replace($inizio_ricerca, "", $parola);
    if (!empty($parola)) {
        $array[] = $parola;
    }
}
fclose($fr);

// secondo ciclo per apici singoli
$fr = fopen($file, 'r');
while (!feof($fr)) {
    $riga = fgets($fr);
    $inizio_ricerca = "('";
    $fine_ricerca = "')";
    $inizio = strpos($riga, $inizio_ricerca);
    $fine = strpos($riga, $fine_ricerca);
    $chr_da_estrarre = $fine - $inizio;
    $parola = substr($riga, $inizio, $chr_da_estrarre);
    $parola = str_replace($inizio_ricerca, "", $parola);
    if (!empty($parola)) {
        $array[] = $parola;
    }
}

fclose($fr);
var_dump($array);
?>
avevamo fatto qualcosa di simile in questa discussione
non ho commentato se hai bisogno chiedi pure
 
Scusami, ma non mi è chiara una cosa. Credo ci sia un problema con la stampa del tutto:
File che estrapola:
PHP:
#!/usr/bin/php
<?php
function string_to_translate_search($file, $function_name='translate'){
    //$file = "nome_file.php";
    $array = array();

    // primo ciclo per apici doppi
    $fr = fopen($file, 'r');
    while (!feof($fr)) {
        $riga = fgets($fr);
        $inizio_ricerca = $function_name."(\"";
        $fine_ricerca = "\")";
        $inizio = strpos($riga, $inizio_ricerca);
        $fine = strpos($riga, $fine_ricerca);
        $chr_da_estrarre = $fine - $inizio;
        $parola = substr($riga, $inizio, $chr_da_estrarre);
        $parola = str_replace($inizio_ricerca, "", $parola);
        if (!empty($parola)) {
            $array[] = $parola;
        }
    }
    fclose($fr);

    // secondo ciclo per apici singoli
    $fr = fopen($file, 'r');
    while (!feof($fr)) {
        $riga = fgets($fr);
        $inizio_ricerca = $function_name."('";
        $fine_ricerca = "')";
        $inizio = strpos($riga, $inizio_ricerca);
        $fine = strpos($riga, $fine_ricerca);
        $chr_da_estrarre = $fine - $inizio;
        $parola = substr($riga, $inizio, $chr_da_estrarre);
        $parola = str_replace($inizio_ricerca, "", $parola);
        if (!empty($parola)) {
            $array[] = $parola;
        }
    }

    fclose($fr);
    var_dump($array);
    return $array;
}

$array = string_to_translate_search('main.php');
echo(implode(PHP_EOL, $array);
?>

File main.php

PHP:
#!/usr/bin/php
<?php
require('locale.class.php');
$ln = 'en';// La lingua dove si anreà traducendo
$local_dir = './';// La cartella dove di dovranno pescare i file
$ln_file_extension = '.translate'; // Estensione del file della lingua es: .txt
$locale = new LOCALE($ln, $local_dir, $ln_file_extension);

echo($locale->translate('HALLO'));
?>

Cosa stampa lo script:

Codice:
marco@ACER:~/Immagini/translate_class$ ./translation_file_generator.php
array(2) {
  [0]=>
  string(16) "locale.class.php"
  [1]=>
  string(5) "HALLO"
}
locale.class.php
HALLOmarco@ACER:~/Immagini/translate_class$

Mi sembra che non funzioni.

Grazie dell'aiuto!
 
aggiungi un controllo sul risultato della prima ricerca
PHP:
if ($inizio !== false) {
        $fine = strpos($riga, $fine_ricerca);
        $chr_da_estrarre = $fine - $inizio;
        $parola = substr($riga, $inizio, $chr_da_estrarre);
        $parola = str_replace($inizio_ricerca, "", $parola);
        if (!empty($parola)) {
            $array[] = $parola;
        }
    }
se non trovi translate(' salti tutto il resto

edit:
qui ti sei dimenticato una parentesi ) a chiusura
PHP:
echo(implode(PHP_EOL, $array);
 
Ultima modifica:
Scusami criric, ma non ci sto capendo un gran che.
Dato il file main.php
PHP:
<?php
// Includo la classe
require('translator.class.php');

// Istanzio la classe
$local = new TRANSLATOR('languages/', 'it');

echo($local->translate('HALLO'));
echo($local->translate('WORLD'));

?>

e il file che hai fatto tu:

PHP:
<?php
/*
CONFIGURAZIONE
*/
$ln_separator = '|~|';
$source_dir = './';

/*
FUNZIONI
*/

// Questa funzione elenca i percorsi dei files
function files_find($dirname){
	$arrayfiles=Array();
	if(file_exists($dirname)){
		$handle = opendir($dirname);
		while (false !== ($file = readdir($handle))) { 
			if(is_file($dirname.$file)){
				array_push($arrayfiles, $dirname.$file);
			}
		}
		$handle = closedir($handle);
	}
	sort($arrayfiles);
	return $arrayfiles;
}

function string_to_translate_search($file, $function_name='translate'){
    //$file = "nome_file.php";
    $array = array();

    // primo ciclo per apici doppi
    $fr = fopen($file, 'r');
    while (!feof($fr)) {
        $riga = fgets($fr);
        $inizio_ricerca = $function_name."(\"";
        $fine_ricerca = "\")";
        $inizio = strpos($riga, $inizio_ricerca);
        $fine = strpos($riga, $fine_ricerca);
        $chr_da_estrarre = $fine - $inizio;
        $parola = substr($riga, $inizio, $chr_da_estrarre);
        $parola = str_replace($inizio_ricerca, "", $parola);
        if (!empty($parola)) {
            $array[] = $parola;
        }
    }
    fclose($fr);

    // secondo ciclo per apici singoli
    $fr = fopen($file, 'r');
    while (!feof($fr)) {
        $riga = fgets($fr);
        $inizio_ricerca = $function_name."('";
        $fine_ricerca = "')";
        $inizio = strpos($riga, $inizio_ricerca);
        $fine = strpos($riga, $fine_ricerca);
        $chr_da_estrarre = $fine - $inizio;
        $parola = substr($riga, $inizio, $chr_da_estrarre);
        $parola = str_replace($inizio_ricerca, "", $parola);
        if (!empty($parola)) {
            $array[] = $parola;
        }
    }

    fclose($fr);
    var_dump($array);
    return $array;
}

/*
SCRIPT
*/

// Recupero i files
$files = files_find($source_dir);
$strings = string_to_translate_search('main.php');
echo(implode(PHP_EOL, $strings));
?>

Mi viene stampato a video questo:
Codice:
marco@ACER:~/Scrivania/php-translator-code$ php ./translation_create.php
array(4) {
  [0]=>
  string(29) "require('translator.class.php"
  [1]=>
  string(41) "$local = new TRANSLATOR('languages/', 'it"
  [2]=>
  string(5) "HALLO"
  [3]=>
  string(5) "WORLD"
}
require('translator.class.php
$local = new TRANSLATOR('languages/', 'it
HALLO
WORLD

Invece non capisco perché stampa tutta questa robaccia. Dovrebbe solamente stampare
Codice:
HALLO
WORLD

Puoi aiutarmi a risolvere?
 
devi aggiungere anche quella if che ti avevo indicato altrimenti ti stampa anche tutte le righe che contengono ")
ma che non iniziano con translate("
PHP:
<?php

function string_to_translate_search($file, $function_name='translate') {
    //$file = "nome_file.php";
    $array = array();

    // primo ciclo per apici doppi
    $fr = fopen($file, 'r');
    while (!feof($fr)) {
        $riga = fgets($fr);
        $inizio_ricerca = $function_name . "(\"";
        $fine_ricerca = "\")";
        $inizio = strpos($riga, $inizio_ricerca);
        if ($inizio !== false) {
            $fine = strpos($riga, $fine_ricerca);
            $chr_da_estrarre = $fine - $inizio;
            $parola = substr($riga, $inizio, $chr_da_estrarre);
            $parola = str_replace($inizio_ricerca, "", $parola);
            if (!empty($parola)) {
                $array[] = $parola;
            }
        }
    }
    fclose($fr);

    // secondo ciclo per apici singoli
    $fr = fopen($file, 'r');
    while (!feof($fr)) {
        $riga = fgets($fr);
        $inizio_ricerca = $function_name . "('";
        $fine_ricerca = "')";
        $inizio = strpos($riga, $inizio_ricerca);
        if ($inizio !== false) {
            $fine = strpos($riga, $fine_ricerca);
            $chr_da_estrarre = $fine - $inizio;
            $parola = substr($riga, $inizio, $chr_da_estrarre);
            $parola = str_replace($inizio_ricerca, "", $parola);
            if (!empty($parola)) {
                $array[] = $parola;
            }
        }
    }

    fclose($fr);
    return $array;
}

$array = string_to_translate_search('main.php');
echo(implode(PHP_EOL, $array));
?>
 
Ok, grazie, ora funge. Solo un'altra cosa. Nel caso ci fossero più di una funzione a riga?

PHP:
echo($local->translate('WORLD').($local->translate('CIAO'));
 
la situazione si complica un po:
la funzione strpos accetta anche un terzo parametro guarda qui
potresti sfruttarlo per trovare ulteriori ricorrenze
al momento non mi viene in mente niente di intelligente ma la soluzione c'è sicuramente
 

Discussioni simili