2016-04-15 11 views
0

Ich habe ein PHP-Skript, das Benutzereingaben verarbeitet. Ich muss allen Sonderzeichen entkommen, aber auch klickbare Links machen (verwandle sie in <a> Elemente). Was ich brauche, ist:htmlspecialchars und make links clickable

function specialCharsAndLinks($text) { 
    // magic goes here 
} 
$inp = "http://web.page/index.php?a1=hi&a2=hello\n<script src=\"http://bad-website.com/exploit.js\"></script>"; 
$out = specialCharsAndLinks($inp); 
echo $out; 

Der Ausgang sein sollte (in HTML):

<a href="http://web.page/index.php?a1=hi&a2=hello">http://web.page/index.php?a1=hi&amp;a2=hello</a> 
&lt;script src="http://bad-website.com/exploit.js"&gt;&lt;/script&gt; 

Beachten Sie, dass die amperstand in dem Link in dem href Attribute bleibt, ist aber auf &amp; in dem eigentlichen Inhalt umgewandelt der Verbindung.

Wenn in einem Browser angezeigt:

http://web.page/index.php?a1=hi&a2=hello < script src = "http://bad-website.com/exploit.js" > </script >

Antwort

0

Try this:

$urlEscaped = htmlspecialchars("http://web.page/index.php?a1=hi&a2=hello"); 
$aTag = '<a href="$urlEscaped">Hello</a>'; 
echo $aTag; 

Ihr Beispiel funktioniert nicht, weil, wenn die gesamte HTML-Tag, a Tag wird nicht durch den Browser, sondern stattdessen verarbeitet werden wird nur als einfacher Text angezeigt.

Wie Sie sehen, entgeht stackoverflow unserem gesamten Input (Fragen/Antworten ...), so dass wir den Code tatsächlich sehen können und ihn nicht vom Browser verarbeiten lassen.

+0

Mein Beispiel funktioniert perfekt. Der Link in der gerenderten Ausgabe ist ein "" -Tag. – randomdude999

+0

Willst du sagen, dass du nur 'Hallo' siehst? (processed tag) – Borna

+0

Ok, also warum nicht einfach den Inhalt dekodieren? Inhalt htmlspecialchars_decode() – Borna

0

Ich löste es schließlich mit:

function process_text($text) { 
    $text = htmlspecialchars($text); 
    $url_regex = "/(?:http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+(?:\/\S*)?/"; 
    $text = preg_replace_callback($url_regex, function($matches){ 
     return '<a href="'.htmlspecialchars_decode($matches[0]).'" rel="nofollow">'.$matches[0]."</a>"; 
    }, $text); 
    return $text; 
} 

Die erste Zeile HTML-kodiert die Eingabe.
Die zweite Zeile definiert den URL Regex. Könnte verbessert werden, aber für jetzt arbeiten.
Die dritte Zeile verwendet preg_replace_callback, eine Funktion, die wie preg_replace ist, aber anstatt es mit einem Ersatz-String liefern, liefern Sie ein Ersatz Funktion, die den Ersatz-String zurückgibt.
Die 4. Zeile ist die eigentliche Funktion. Es ist ziemlich selbstdokumentierend. htmlspecialchars_decode macht die Aktionen von htmlspecialchars rückgängig (daher wird der Link gültig, wenn er einen Amperstand enthält).

Verwandte Themen