manuale php su stringhe ed espressioni regolari

salve,

ho letto questa pagina e non ho ben capito alcune cose:

  • // Returns true if client browser is Netscape 2, 3 or MSIE 3.
    eregi("(ozilla.[23]|MSIE.3)", $_SERVER["HTTP_USER_AGENT"]);
    come fa a capire se è "netscape 2", o "netscape 3" e non "netscape 23"?;
  • // Places three space separated words into $regs[1], $regs[2] and $regs[3].
    ereg("([[:alnum:]]+) ([[:alnum:]]+) ([[:alnum:]]+)", $string, $regs);
    questa proprio non l'ho capita...

infine, m'interesserebbe molto approfondire quest'argomento: potreste passarmi un po' di materiale a riguardo? dovrei creare un parser di testi, e oltre alle funzioni php, questi metacaratteri farebbero al caso mio.

grazie

inviato 8 anni fa
larchitetto
modificato 8 anni fa
X 0 X

per prima cosa lascia perdere le funzioni ereg e passa alle preg:

http://it2.php.net/manual/en/ref.pcre.php

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

ah =/

ok, ma per quale motivo di preciso? XD

grazie

risposto 8 anni fa
larchitetto
X 0 X

Per un discorso di performance, le preg sono molto più veloci delle ereg, inoltre il PHP 6 le ereg non ci saranno più.

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

bene.

mi serve un po' di chiarezza che mi son un po' "incartato".

il problema nasce dalle form e dall'output prelevato da db (che molte volte il db è popolato da dati provenienti dalle form).

non ho ben inteso "il numero delle occorrenze", cioè del significato delle {} nelle espressioni regolari.

inoltre, il server che uso aggiunge automaticamente una \ ad ogni ' che incontra. magari l'utente commette un errore, il programma torna indietro e ridà nella textarea lo stesso testo inserito. n errori, n redirect alla form con n \ inseriti dietro a '...

ecco vorrei capire bene come faccio a prelevare i dati dalla form, a renderli sicuri durante la fase di insert o update (indi memorizzare &#39; anzichè ' nel db) e a stampare a video (sia se in textarea che su un normalissimo <p>) il dato così prelevato.

lo stesso problema si pone anche con \...

grazie

risposto 8 anni fa
larchitetto
modificato 8 anni fa
X 0 X

stia facendo riferimento a problemi diversissimi tra loro...

il numero delle occorrenze serve ad indicare quante volte una particolare sequenza di caratteri può o deve ripetersi consecutivamente (da un minimo ad un massimo)

l'aggiunta dello \ è legato ad una impostazione del php, modificabile dal php.ini. Si chiama "Magic Quotes":

http://it2.php.net/magic_quotes

puoi anche eliminare a posteriori questi \ con la funzione stripslashes()

nel database non devi convertire i caratteri "speciali" ma devi inserirli così come sono, ovviamente senza slash. E' in visualizzazione che devi prendere le opportune precauzioni, magari usando la funzione htmlspecialchars

Se leggi il corso PHP/MySQL troverai molte indicazioni su come procedere:

http://www.phpnews.it/corsi/corso-php-mysql/

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

si sapevo si trattasse di problemi diversi... solo che ieri sera ero mentalmente stanco...

adesso mi leggo per bene il materiale passato e vedo come destreggiarmi in tutto ciò :)

è un'impressione, oppure http://it2.php.net/magic_quotes con il php 6 sparirà? e se si, che si potrà fare in alternativa?

grazie

risposto 8 anni fa
larchitetto
modificato 8 anni fa
X 0 X

sparendo il magic quote il PHP non farà più lo scherzo di aggiungere gli \ ai dati inseriti dall'utente e quindi non dovremo preoccuparci di toglierli  ;)

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

bene, fino ad allora procederemo come si deve, o almeno spero.

ho elaborato un po' di codice per risolvere il problema, ma prima vorrei esplicare prima cos'intendo fare.

l'input viene dalle form, i cui dati andranno nel database o rimandati alle form inizializzando così i vari tag d'input e textarea.

inoltre, ci sono dei dati che non andranno in output, ma saranno presi, elaborati e confrontati con il database o memorizzati (ad esempio il timestamp dell'accesso di un utente dopo il login).

infine c'è l'output "di sistema", cioè tutte quelle stringhe predefinite dal programma (errori da mysql, intestazioni, menu etc).

per fra fronte a queste esigenze, ho elaborato quanto segue:

/*prende i dati da POST e ne leva tutti i fastidiosi \ per fare l'escape di caratteri potenzialmente pericolosi,così le textarea saranno così come scritte dall'utente*/
   FUNCTION textarea() //nessun parametro
   {
      foreach ($_POST as &$post) if (get_magic_quotes_gpc()) $post=stripslashes($post);
   }
/*qui invece leva tutti i tag html, e se ctrl è true e ci sono \ per l'escape, li leva; dopodichè inserirà \ per tutti i caratteri potenzialmente pericolosi*/
   FUNCTION database($ctrl) //parametro: boolean
   {
      foreach ($_POST as &$post) {
         strip_tags($post);
         if ($ctrl && get_magic_quotes_gpc()) $post=stripslashes($post);
         $post=mysql_real_escape_string($post); 
      }
   }
/*infine, prendendo i dati dal database o dagli script, converto tutti i caratteri speciali e aggiungo <br /> in luogo di \n.*/
   FUNCTION output($stringa) //parametro: stringa
   {
      if (!is_string($stringa)) return "";
      return nl2br(htmlentities($stringa));
   }
/*questa funzione la amplierò (o ne farò una nuova) con il riconoscimento di alcune espressioni regolari che comporranno dei tag html leciti*/

modifiche da effettuare?

grazie

risposto 8 anni fa
larchitetto
modificato 8 anni fa
X 0 X

sono d'accordo sul togliere gli slash a $_POST, magari puoi fare così:

http://www.phpnews.it/tips-tricks/php/scrivere-codice-indipendente-dal-magic-quotes/

invece mysql_real_escape_string e htmlentities lo userei solo sulle variabili che mi serve controllare e non su tutto l'array $_POST

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

beh, sull'array POST ci saranno solo textarea e un pulsante di submit. indi ho dedotto che in questo caso, ciclarlo o no dopo aver confrontato quale pulsante è stato cliccato, non avrebbe molta importanza, perchè non lo userei più.

ok, tolto questo, metto un appunto di commento del link sulle funzioni e procedo avanti (un po' di fretta perchè ansioso di concludere, non devo migrare: i cambiamenti li avrò quando installeranno il php 6).

mi pare ci sia tutto, no?

risposto 8 anni fa
larchitetto
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda