Newsgroup: it.comp.www.php
Titolo: Parse testo alla ricerca di stringhe troppo lunghe

Vorrei realizzare una funzione che, preso in input un testo, lo analizzi 
  rimpiazzando tutte le stringhe che eccedono una determinata lunghezza 
con stringhe abbreviate.
Ad esempio
input:
modules.php?op=modload&name=Comments&file=index&req=Reply&pid=3&sid=1&mode=nested&order=0&thold=0AJs 
lakjsajLKJASçKJASçlkasàajs
output:
modules.php?op=modload...lakjsajLKJASçKJASçlkasàajs
Come posso fare?
Devo utilizzare le espressioni regolari?
Chiedo l'aiuto da casa! :)
Ciao

 Come posso fare?
Od utilizzi substr etc oppure le espressini regolari.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 Od utilizzi substr etc oppure le espressini regolari.
potresti fornirmi un esempio con le espressioni regolari?
grazie mille :)

 potresti fornirmi un esempio con le espressioni regolari?
<?php 
$string = "
modules.php?op=modload&name=Comments&file=index&req=Reply&pid=3&sid=1&mo
de=nested&order=0&thold=0AJs lakjsajLKJASçKJASçlkasàajs ";
$pattern = "/ ([^\s]{22})[^\s]*?([^\s]{22}) /si";
$replacement = "\${1}...\${3}";
print (preg_replace ($pattern, $replacement, $string));
?>


 ?>
ti ringrazio, cerco di studiarmela per capire bene il senso :)
Io stavo lottando con qualcosa del genere
preg_replace(/\b\w{20}\b/gi , "ECCO", $string)
ovviamente non funzionava!
Ciao

Setec Astronomy ha scritto:
 > Movie Maniac® wrote:
 >
 >
 >> potresti fornirmi un esempio con le espressioni regolari?
 >
 >
 >
 > <?php $string = "
 > modules.php?op=modload&name=Comments&file=index&req=Reply&pid=3&sid=1&mo
 > de=nested&order=0&thold=0AJs lakjsajLKJASçKJASçlkasàajs ";
 > $pattern = "/ ([^\s]{22})[^\s]*?([^\s]{22}) /si";
 > $replacement = "\${1}...\${3}";
 > print (preg_replace ($pattern, $replacement, $string));
 > ?>
è possibile che ci sia un errore e che in realtà anziche
$replacement = "\${1}...\${3}";
debba essere
$replacement = "\${1}...\${2}"; ?
Se ho capito bene, i lpattern che mi hai indicato spezza le parole più 
lunghe di 22*2 caratteri in due tronconi da 22 appunto
mentre il "replacement" dovrebbe sostituire le parole corrispondenti al 
pattern nella forma:
spezzone1...spezzone2
giusto?
grazie mille per la tua pazienza :)
Ciao

 spezzone1...spezzone2
[..]
dovrebbe dividere in tre parti..
parte 1 (22) parte 2 (*) parte 3 (22)
risultato 
parte 1 ... parte 3
-- 
www.iuz-lab.info

iuz ha scritto:

eh, anche io resto convinto di questo. Ho provato con preg_match e ho 
visto che mi restituisce un array di tre elementi così formato:
0 = testo che corrisponde
1 = primo pezzo
2 = secondo pezzo
ecco perchè facevo quella domanda.
E l'unico modo in cui andava era quello riportato prima, se usavo 1 e 3 
con preg_replace mi stampava solo il promo ezzo e i puntini.
Ora ho messo a punto questa funzione:
function comments_fixed_tables($string) {
    if(strlen($string) ==0) return;
    $search = array ("'<script[^>]*?>.*?</script>'si",  //Rim. javascript
                     "'<[\/\!]*?[^<>]*?>'si",           //Rim. tag HTML
                     "'([\r\n])[\s]+'",                 //Rim. spazi 
                     "'&#(\d+);'e");                    //Val. codice PHP
 
    $array = $replaced = array();
    $str['old'] = $string;
    foreach($search as $key) {   //Tolgo ad uno ad uno i tag
                                 //salvandoli in un arrai
                                 //per poi rimetterli alla fine
       do {
          if(isset($str['new'])) {
             $str['old']=$str['new'];
          }
          preg_match($key, $str['old'], $result);
 
          array_push($array, $result[0]);
 
          $cnt = count($array)-1;
          $newkey = " # ". $cnt ." # ";
 
          array_push($replaced, $newkey);
 
          $str['new'] = preg_replace($key, $newkey, $str['old'], 1);
       } while ($str['new']!=$str['old']);
    }
    $pattern = "/ ([^\s]{4})[^\s]*?([^\s]{4}) /si";
    //codice da sostituire, nella forma
    // <span title="testo_sostituito" style"">Pezzo1...Pezzo2</span>";
    $replacement = " <span title=\"\${0}\" style=\"font-style: italic; 
text-decoration: underline;\">\${1}...\${2}</span> ";
    //accorcio le parole troppo lunghe
    $string = preg_replace($pattern, $replacement, $str['new']);
    //reinserisco i tag html e restituisco il testo pulito
    return str_replace($replaced, $array, $string);
}
il codice sembrerebbe funzionare bene (le entità html le ho volutamente 
scartate per evitare problemi) su tutte le parole più lunghe di 8 
caratteri, tranne che per la stringa
modules.php?op=modload&name=Comments&file=index&req=Reply&pid=3&sid=1&mode=nested&order=0&thold=0AJslakjsajLKJASçKJASçlkasàajs
Come mai sto mistero? :(
Grazie per la disponibilità

iuz ha scritto:

Ho capito come mai mi restituisce solo due spezzoni.
Con questo pattern ora mi restituisce tre spezzoni:
$pattern = "/ ([^\s]{4})([^\s]*)?([^\s]{4}) /si";
esempio:
$string = "semplicemente";
$pattern = "/ ([^\s]{4})([^\s]*)?([^\s]{4}) /si";
preg_match($pattern, $str['new'], $arr);
die(print_r($arr));
// Stampa
Array ( [0] => semplicemente [1] => semp [2] => licem [3] => ente ) 1
(il patterni di Setec era: "/ ([^\s]{22})[^\s]*?([^\s]{22}) /si", notare 
le parentesi nella parte centrale, ([^\s]*) )
rimane sempre il fatto tuttavia, che con la stringa
modules.php?op=modload&name=Comments&file=index&req=Reply&pid=3&sid=1&mode=nested&order=0&thold=0AJslakjsajLKJASçKJASçlkasàajs
non mi funziona ahimè :(
grazie

Movie Maniac® ha scritto:
[CUUUUUUT]
OK, sembra che sia riuscito a risovere tutto.
Ecco la funzioncina che ho scritto, pareri e consigli?
function comments_comment_long_words($string) {
    if(strlen($string) ==0) return;
 
    //	array of tags to strip off before shotening long words
    $search = array ("'<script[^>]*?>.*?</script>'si",  // Rim. javascript
    "'<[\/\!]*?[^<>]*?>'si",// Rimozione dei tag HTML
    "'([\r\n])[\s]+'",      // Rimozione degli spazi bianchi
    "'&#(\d+);'e");         // Valuta come codice PHP
 
    $array = $replaced = array();	//	initializing arrays
    $str['old'] = $string;
    foreach($search as $key) {
       do {
          if(isset($str['new'])) {
             $str['old']=$str['new'];
          }
          //searching current tag
          preg_match($key, $str['old'], $result);
 
          array_push($array, " ".$result[0]." ");
          //creating an array with replaced tags
 
          $cnt = count($array)-1;
          $newkey = " mdc# ". $cnt ." # ";	
          //mdc is just an anchor, and stands for MD Comments (This module)
 
          array_push($replaced, $newkey);//creating an array of replacements
 
          $str['new'] = preg_replace($key, $newkey, $str['old'], 1);	
          //replacing tags
 
       } while ($str['new']!=$str['old']);
    }
    //	pattern for too long words shortening ((1st PIECE of 4 chars),
    //	(2nd PIECE), (3rd piece of 4 PIECE))
    $pattern = "/([^\s]{15})([^\s]*)([^\s]{15})/si";
    //	replacement for too logn words with <span title="REPLACEDTEXT"
    //	style="...">1stPIECE...2ndPIECE</span>
    $replacement = " <span title=\"\${0}\" style=\"font-style: italic; 
text-decoration: underline; line: dashed;\">\${1}...\${3}</span> ";
    //	cutting down all too long words
    $string = preg_replace($pattern, $replacement, $str['new']);
    //	putting back all the tags previously taken away
    return str_replace($replaced, $array, $string);
}	//	Closes comments_comment_long_words function
Ciao e grazie per le dritte che m'avete dato ;)