Visualizza la versione completa : Espressioni regolari
nitros1980
25/02/10, 19:17
Allora ragazzi chi se ne intende?
Ho creato questo piccolo script php. Il suo scopo è riconoscere all'interno di una stringa una combinazione di caratteri che formano una emoticon e sostituire questa combinazione con la parola emoticon.
Lo script è:
<?php
$string3=": )";
$emo = preg_replace ('((♥)|((\^|O|X|:|;|-|>|=)(\s)?(-)?(.)?(°)?(=)?(;)?(_)*(\)|D|P|p|o|\^|-|\(|\*)+))', 'emoticon', $string3);
echo $emo;
?>Ho calcolato le varie combinazioni(quelle che mi sono venute in mente). Che ne pensate?potrebbero esserci falle?
Una cortesia, i codici html, php o altro inseriteli negli appositi bbcode che trovate nel editor di testo quando create o rispondete ad un messaggio :ok
nitros1980
25/02/10, 19:47
scusa simo va bene
FICHISSIMO!!! !:ok :ok :ok :ok
a che serve??? :dub
:D :D
facendo un paio di prove al volo ho notato che se l'emoticon è composta di soli 2 caratteri tipo :) o :d non matcha, altrettanto con :-) o :_)
le prove le ho fatte al volo e sto per addormentarmi...da sveglio ci guardo meglio... :D
nitros1980
26/02/10, 03:01
riprova ora ^^
queste? 0.0 *.* -.- -.-' XD
Me ne vengono un paio:
Oo.org (prova su google)
oppure alcuni linguaggi di programmazione commentano con il punto e virgola, guarda questo commento:
;-------------------------------------------------------------------------------------------------------------------------------
Poi non supporta lo stupore :-O,
il mio consiglio è: PROVO _DI NUOVO_
nitros1980
26/02/10, 10:48
ahhhhhhhrgh non sono un esperto emoticoniano mi devo fare una cultura eheh
http://it.wikipedia.org/wiki/Emoticon
:ok
FICHISSIMO!!! !:ok :ok :ok :ok
a che serve??? :dub
:D :D
Io continuo a non capire :dub
Chi me lo spiega come se fossi un bambino di 4 anni?
nitros1980
26/02/10, 12:57
io io!
serve a sostituire una specifica sequenza di caratteri con altri caratteri, parole o altro a tua scelta. In questo caso dovrebbe(e dico dovrebbe) servire a sostituire le combinazioni di caratteri che formano emoticons(le faccine per intenderci) con una parola identificativa(in questo caso la parola emoticon).
Scin è difficile spiegarla ad un bambino di 4 anni :D
Sono espressioni che permettono di ricercare testo all'interno di documenti, per esempio l'espressione "ciao" cerca appunto ciao (e ne permette la sostituzione), ma se ad cerchi sia "cia" che "ciao" puoi indicare la "o" opzionale con il punto interrogativo, scrivendo "ciao?", oppure se il numero di "o" è imprecisato scrivi "ciao*" e lui trova "cia", "ciao" ma anche "ciaoooo".
Come vedi serve solo per la ricerca, se usi l'espressione "scin(tilla)?" lui cerca sia "scin" che "scintilla" in tutto il forum ;)
nitros1980
26/02/10, 14:00
aggiornata l'espressione regolare
prova anche tu: SONO PIRLA :ridi2
nitros1980
01/03/10, 13:49
:P ho abbandonato questa soluzione dato che sono un novizio e ci ho perso un mucchio di tempo per fare una cosa che non va. Quindi invece che far riconoscere le emoticons in base ai singoli segni di puntggiatura provo a fare un array con tutte le emoticon che mi interessano e dargli in pasto quello. Il problema è che a volte mi prendeva come emoticon anche punteggiatura che non doveva essere riconosciuta come tale etc...purtroppo molte righe hanno emoticon di questo tipo(che non sono proprio emoticon ma vengono usate come tali): :)))))))))))))))) . Vedo che riesco a far uscire. Cmq per chi è curioso questa era l'espressione a cui ero giunto ma che no mi faceva esostituire bene tutte le emoticon (del tipo : P oppuire : O )
<?php
$string3=" :-o";
//$emo = preg_replace ('(((♥)+|(\(|\^|O|X|:|;|-|>|\)|=))?(\s)?(-)?(.)?(°)?(=)?(;)?(_)*(\)|D|P|p|o|\^|-|\(|\*)+)', 'emoticon', $string3);
$emo = preg_replace ('#((:|=|(\^){1}|X|B|8|T|;|(o){1}|(O){1}|\>|\<|\*|(°){1}|(-){1})\'?o?((°){1})?-?((_){1,2})?-?\s?\'?\.?((\))+|(\])+|(\>)+|(\^){1}|(\()+|(\[)+|(\<)+|D+[^A-Za-z]|P+[^A-Za-z]|p+[^A-Za-z]|((-){1})+|([^\w]o+[^A-Za-z])|([^O]O[^A-Za-z])+))#', ' emoticon ', $string3);
echo $emo;
?>
nitro sei arrivato alla soluzione giusta: non si può fare.
Non so a cosa ti serva ma l'unica cosa è avere una enumerazione di simboli che inequivocabilmente sono una emoticon, o comunque devi essere più restrittivo, ad esempio:
[:;XB]'?-?[\)\(|/\\poO*\>\<\]\[\{\}]
ne lascerai fuori un po', quelle magari le gestisci opportunamente, come: :-?o{1,20}
nitros1980
01/03/10, 14:34
esatto :P potevi dirmelo prima!! ahahahah scherzo mi piacciono però almeno mi sono un po' indottorato. per la cronaca mi servono per eliminare le emoticon per fae una ricerca linguistica
Si bhe cosa fa l' ho capito.
Ma che applicazione ha una funzione del genere? :dub
nitros1980
02/03/10, 00:34
a me serve per uno studio linguistico ;P
però la sostituzione di porzioni di stringhe viene usata molto spesso..ora non so come funziona il forum ma anche qua dovrebbe esserci una funzione che se digiti i caratteri di una emoticon te li sostituisce con l'immaginina corrispondente(almeno dovrebbe essere cosi)
nitro nella tua ricerca linguistica sono rilevanti i segni di interpunzione (o possono essere rimossi in blocco?)
nitros1980
02/03/10, 10:54
i segni li toglierò dopo aver sostituito eventuali url nelle stringhe e le emoticon. A dir la verità non so se eliminarli proprio con una funzione [:punct:] o lasciarli. Devo contare e fare una media delle parole che formano tutte le stringhe per fini statistici e quindi la punteggiatura non conta. Ora ho visto che esiste questa funzione php str_word_count che non dovrebbe contare la punteggiatura ma devo testarla.
ed allora lascia perdere le emoticon...
nitros1980
02/03/10, 17:41
perchè? le emoticon le devo contare a parte(sempre per fini statistici)
ah, allora metti almeno il vincolo che le emoticon, come le altre parole, siano separate da spazi (SENNO' NON LO BECCO)
a me serve per uno studio linguistico ;P
E ci voleva tanto a dirlo prima ???? :incaz
Thanks :angelo
nel forum di solito c'è un array di emoticon e si usa la str_replace(); che quando acchiappa un determinato set di caratteri li trasforma in quello che si vuole per esempio : ok in :ok...
Nitro ti ho risposto per mp.. appena torno in italia vedo di darti una mano :ok
nitros1980
04/03/10, 14:41
figurati Raiden no problema:) grazie a tutti per l'aiuto!
come faccio a dire che una parola deve iniziare per un dato carattere?
mi sembra ci sia il segno ^ ma non identifica una l'inizio di una stringa invece che di una parola?
lo fai così
http://www.regular-expressions.info/lookaround.html
ma non è il tuo problema, tu cerchi il testo, un qualcosa del tipo \w+, quindi devi fare un ciclo di find su tutta la stringa oppure splittare per \W+ ed avray un arrai di parole, decidi però come gestire l'apostrofo e l'accento ;)
nitros1980
04/03/10, 23:14
Aggiornamento:
per standardizzare i testi che vado ad analizzare ho fatto questo stralcio di codice. Dato che stavo impazzendo ho utilizzato un metodo grezzo ma sembra funzionare. Il sistema prende i dati, toglie le emoticon, toglie la punteggiatura, toglie gli spazi in eccesso e poi conta le parole(che poi era il mio fine).
<?php
//numero livelli
$livelli="select max(livello) AS numeroLivelli from testi_modificati";
$res_livelli=mysql_query($livelli, $db);
$num_liv= mysql_fetch_array($res_livelli);
//echo $num_liv['numeroLivelli'];
// standardizzazione del testo e scrittura in testi_modificati
$query="select id_testo, testo from testi_modificati";
$result=mysql_query($query, $db);
while ($row=mysql_fetch_array($result)){
$string=" ".$row['testo']." ";
//$string1 = preg_replace ('/♥+/', ' ', $string);
$string2 = preg_replace ('#((♥+)|((:|=|;)\s?-?o?0?\)+)|((=|:)\'?\s?-?\(+)|([^A-Za-z0-9]:\'\s?-?\<+)|([^A-Za-z0-9]:\s?-?\>+)|(\^\s?_*-*\.?\s?\^)|([^A-Za-z0-9](=|:|;)\s?-?D+)|((X|:)\s?-?P+)|([^A-Za-z0-9]:\s?-?p+)|(:\s?-?\|)|([^A-Za-z0-9](:|=)\s?-?\]+)|([^A-Za-z0-9]:\'?\s?-?\[+)|([Xx]\s?-?D)|([^A-Za-z0-9]:\s?-?\*+)|(\*\s?_*.?\*)|([-=]\s?_*\.?[-=])|([^A-Za-z0-9]:\s?-?/)|([^A-Za-z0-9][oO]\.?-?_*[oO])|(\>_*\.?\<)|([^A-Za-z0-9]è\.?_*é)|([^A-Za-z0-9]:\.?-?O+)|(:°D+)|([^A-Za-z0-9];\s?-?\)+)|([^A-Za-z0-9];\s?-?\]+)|([^A-Za-z0-9];\s?-?P+)|([^A-Za-z0-9];\s?-?p+)|(\>-?\))|(X\s?-?\)+)|(x-?_?x)|(X\s?-?\(+)|((u|U)_(u|U))|(:-S+))#', ' ', $string);
// Array che contiene tutti i caratteri da togliere
$caratteri= array(".", ",", "-", "!",";",":","_","'","?","=","(",")","'","\"","<",">","°","§","*","^");
//utilizzo il replace per toglierli
$string3= str_replace($caratteri, " ", $string2);
$string4= preg_replace('/ +/', ' ', $string3);
//echo $row['id_testo']."--" .$string4."<br>";
if ( !get_magic_quotes_gpc() ){
$testo = addslashes( $string4 );
}
else
{
$testo = $string4;
}
$query2="update testi_modificati set testo='$testo' where id_testo='$row[id_testo]'";
//echo $query2. "<br />";
$result2=mysql_query($query2, $db) or die();
$numero=mysql_affected_rows();
//echo "record".$numero."<br /><br />";
//fine standardizzazione
}
//inizio conteggio parole per livelli
$liv=1;
$somma_parole=0;
$numero_livelli=$num_liv['numeroLivelli'];
//echo $numero_livelli;
for($i=1;$i<=$numero_livelli;$i++){
$query="select id_testo, testo from testi_modificati where livello='$liv'";
//echo $query."<br />";
$result=mysql_query($query, $db);
$numero_messaggi=mysql_num_rows($result);
while($row=mysql_fetch_array($result)){
$num=str_word_count($row['testo'], 0, '0123456789èéìòùàÉüó@');
//echo $num.'<br /><br />';
$somma_parole=$somma_parole+$num;
}
echo"MEDIA PAROLE LIVELLO: ".$liv."<br />";
echo"Numero di messaggi: ".$numero_messaggi."<br />";
echo"Somma delle parole: " .$somma_parole."<br />";
echo "Media parole: ".$somma_parole/$numero_messaggi."<br /><br />";
$liv++;
$somma_parole=0;
}
?>
critiche e suggerimenti sono ben accetti naturalmente
vBulletin® v3.8.5, Copyright ©: 2000-2024, Jelsoft Enterprises Ltd.
Traduzione italiana Team: vBulletin-italia.it |