PDA

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?

Simo
25/02/10, 19:29
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

Urano
25/02/10, 20:01
FICHISSIMO!!! !:ok :ok :ok :ok


a che serve??? :dub

:D :D

lucad111
26/02/10, 00:52
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 ^^

dibudabu
26/02/10, 09:03
queste? 0.0 *.* -.- -.-' XD

Phos
26/02/10, 09:51
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

Phos
26/02/10, 11:22
http://it.wikipedia.org/wiki/Emoticon
:ok

SCINTILLA
26/02/10, 12:48
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).

Phos
26/02/10, 13:26
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

Phos
01/03/10, 10:01
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;
?>

Phos
01/03/10, 14:27
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

SCINTILLA
01/03/10, 22:41
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)

Phos
02/03/10, 09:24
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.

Phos
02/03/10, 12:38
ed allora lascia perdere le emoticon...

nitros1980
02/03/10, 17:41
perchè? le emoticon le devo contare a parte(sempre per fini statistici)

Phos
02/03/10, 22:25
ah, allora metti almeno il vincolo che le emoticon, come le altre parole, siano separate da spazi (SENNO' NON LO BECCO)

SCINTILLA
03/03/10, 23:56
a me serve per uno studio linguistico ;P

E ci voleva tanto a dirlo prima ???? :incaz

Thanks :angelo

Raiden
04/03/10, 00:44
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?

Phos
04/03/10, 20:56
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