Фильтровать пользовательский ввод (абзац) для ссылок + смайлики - PullRequest
0 голосов
/ 09 октября 2009

Я смотрю на какой-то существующий фильтр, который может дезинфицировать пользовательский ввод, чтобы избежать XSS. Вероятно, я могу использовать htmlspecialchars для этого. Но в то же время я хочу иметь возможность анализировать все ссылки (должен соответствовать a.com, www.a.com и http://www.a.com, а если это http://www.aaaaaaaaaaaaaaaaaaaaaaaaaa.com, то он должен отображаться как aaa ..a.com), электронные письма и смайлики.

Мне интересно, как лучше это сделать. В настоящее время я использую функцию php с некоторым регулярным выражением, но много раз регулярное выражение просто терпит неудачу (из-за неправильного распознавания ссылки и т. Д.). Я хочу что-то очень похожее на парсер, используемый во время чата Google (даже a.com работает).

Спасибо за ваше время.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2010

Для смайликов вы можете посмотреть http://www.php.net/manual/en/book.bbcode.php (требуется php 5.2.0 или выше, если вы не можете установить его из PECL)

0 голосов
/ 09 октября 2009

Простой способ (попытаться!) Получить ссылки из строки выглядит примерно так:

$text = 'I am looking at some sort of existing filter which can sanitize 
the user input to avoid XSS. Probably I can use htmlspecialchars for that. 
But at the same time I want to be able to parse all links (should match 
a.com, www.a.com and http://www.a.com and if it is 
http://www.aaaaaaaaaaaaaaaaaaaaaaaaaa.com then it should display it 
as aaa..a.com), e-mails and smileys.

I am wondering what is the best way to go about it. I am currently using 
a php function with some regex, but many times the regex simply fails 
(because of link recognition is incorrect etc.). I want something very 
similar to the parser used during Google Chat (even a.com works).';

preg_match_all('/\S+\.(?:com|org|net)/i', $text, $urls);

print_r($urls);

Который производит:

Array
(
    [0] => Array
        (
            [0] => a.com
            [1] => www.a.com
            [2] => http://www.a.com
            [3] => http://www.aaaaaaaaaaaaaaaaaaaaaaaaaa.com
            [4] => aaa..a.com
            [5] => a.com
        )

)

И после сопоставления (возможно!) URL вы можете очистить список: т.е. удалите недействительные, такие как 'aaa..a.com' и укоротите очень длинные URL-адреса, такие как * 1008

Я не рекомендую собирать все в одно большое, не поддерживаемое регулярное выражение. Делай это по шагам.

Удачи!

PS. Излишне говорить, что вы можете / должны расширить список TLD самостоятельно. (?: com | org | net) был просто примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...