2012-01-20 9 views
15

Ho un collegamento mailto: in una pagina qui compresi i parametri subject= e body= ma non sono sicuro su come eseguire correttamente l'escape dei dati nei parametri.Qual è il modo corretto di sfuggire a una stringa per un collegamento mailto

La pagina è codificata in utf-8 quindi immagino che tutti i caratteri speciali come le dieresi tedesche debbano essere codificati anche nelle rappresentazioni utf-8 per l'URL?

Al momento sto usando rawurlencode() come urlencode() sarebbe inserire + caratteri in tutti i luoghi dove gli spazi avrebbero dovuto essere, ma non sono sicuro se questo è il modo corretto per farlo.

+0

avrei pensato che o 'rawurlencode()' o r 'urlencode()' dovrebbe fare il lavoro - il browser dovrebbe decodificare correttamente la versione prima di passarla al client di posta. Si potrebbe anche creare un array dei parametri ed usare [ 'http_build_query()'] (http://php.net/manual/en/function.http-build-query.php) - la stringa di query è nello stesso formato . Assicurarsi che si passa anche la stringa risultante da questi opzioni attraverso [ 'htmlspecialchars()'] (http://php.net/manual/en/function.htmlspecialchars.php) se deve essere utilizzato in una pagina HTML ... – DaveRandom

+0

Beh, funziona così in tutti i casi d'uso che ho pensato, ma forse non è il modo corretto di fare questo e il mio browser/client di posta elettronica semplicemente riconoscere e lavorare in modo corretto in giro che l'errore, è per questo che viene chiesto, solo per essere sicuro :) – bardiir

+0

Ci possono essere situazioni in cui uno funzionerà e l'altro no, ma se questo è il caso, sarebbe colpa del browser non interpretarlo correttamente. Se c'è un bug noto con uno o l'altro, ovviamente è meglio evitarlo, ma non conosco nessun browser moderno che possa fare un errore così fondamentale - se ce n'è uno, sarà probabilmente così povero da essere comunque inutilizzabile. – DaveRandom

risposta

13

Hai solo bisogno di rawurlencode() il link alla fine dell'indirizzo di posta elettronica secondo gli standard W3C.

C'è un esempio sul manuale PHP per urlencode (ricerca di mailto in quella pagina): http://php.net/manual/en/function.urlencode.php

+7

prega di notare che 'rawurlencode()' sfuggirà e commerciali a &, che la maggior parte dei client di posta non correttamente decodificare. % 26 dovrebbe essere usato per sostituire questi e commerciali usando qualcosa come 'str_replace ('&', '% 26', rawurlencode ($ subject))' –

+2

@dev_row con quel codice str_replace il '&' sarà stato cambiato in '% 26 amp%3B'. Devi ** prima ** dover sostituire '$ amp;' con '&' e poi fare il rawurlencode(). Inoltre, perché non usare 'htmlspecialchars_decode()' piuttosto che lo str_replace? – Duncanmoo

+0

Ho appena aggiunto una risposta che mostra un esempio utilizzando questa risposta e commenti: https://stackoverflow.com/a/46865401/1617737 –

0
function MailToUrl ($strUser, $strServer, $queryParams = null) { 
    $strUrl = 'mailto:' . rawurlencode($strUser) . '@' . rawurlencode($strServer); 
    if ($queryParams) { 
     $strUrl .= '?' . http_build_query($queryParams, null, null, PHP_QUERY_RFC3986); 
    } 
    return $strUrl; 
} 

function MailToLink ($strUser, $strServer, $queryParams = null) { 
    $strUrl = MailToUrl($strUser, $strServer, $queryParams); 

    $strEscapedUrl = htmlspecialchars($strUrl); 
    $strVisibleUrl = htmlspecialchars(rawurldecode($strUrl)); 

    $strLink = "<a href='{$strEscapedUrl}'>{$strVisibleUrl}</a>"; 

    return $strLink; 
} 

print (MailToLink('"very.(),:;<>[]\".VERY.\"[email protected]\ \"very\".unusual"', 'test.com', ['subject'=>'this & \ that/'])); 
print (MailToLink('müller', 'test.com', ['subject'=>'Einflußgröße'])); 
2

Sulla base delle risposte accettati ed è commenti, questo è ciò che ho usato:

function format_text_for_mailto_param($text) { 
    return rawurlencode(htmlspecialchars_decode($text)); 
} 

Esempio:

$email = "[email protected]"; 
$subject = "Test Subject"; 
<a href="mailto:' . $email . '?subject=' . format_text_for_mailto_param($subject) . '">send email</a> 
+1

Non è necessario '$ testo di ritorno;' alla fine della funzione? – Rober

+0

Grazie a @Rober. Ho aggiornato la mia risposta ora. –

Problemi correlati