Забрана на линкове

bganonymous

Registered
Здравейте! Имам поле $message. Ако полето съдържа някакъв линк, какъвто и да е - да даде грешка! Как става това? :)
 
Ползвай функцията strip_tags(), като може да изброяваш дадени тагове, които да са РЗРЕШЕНИ - например за параграф и т.н.
 
lamerko каза:
Ползвай функцията strip_tags(), като може да изброяваш дадени тагове, които да са РЗРЕШЕНИ - например за параграф и т.н.
То не е HTML код, а обикновено съобщение.
 
Код:
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/i";

if(preg_match($reg_exUrl, $message)) {
  echo "linkowete sa zabraneni ! Zashoto JoTunkiq taka kaza !";
}
:D :?:
 
joTunkiq ти показа начин. Разбери как работи и го промени според твоите нужди! :/ Иначе какъв е смисъла...
 
Ей, не можа да добавиш 5 букви значи. Както и да е, ето по-ОБЯСНИТЕЛЕН вид :D

PHP:
if(preg_match("/http:\/\/|www|[a-zA-Z0-9-]+\.|[a-zA-Z0-9\.-]+@)(([a-zA-Z0-9-][a-zA-Z0-9-]+\.)+[a-zA-Z0-9-\.\/\_\?\%\#\&\=\;\~\!\(\)]+)/i", $message){  echo "JoTunkiq zabranqwa ;) ";}
:D
 
Сега пък ако линка е "http://www" го дава като грешка, но като е без "www" не го дава... :idea: :idea: :idea:
 
Код:
if(preg_match("/(http:\/\/www\.|http:\/\/|https:\/\/|www|[a-zA-Z0-9-_]+\.|[a-zA-Z0-9\.-]+)(([a-zA-Z0-9-][a-zA-Z0-9-]+\.)+[a-zA-Z0-9-\.\/\_\?\%\#\&\=\;\~\!\(\)]+)/ui", $message)){
  echo "zasicha linkowe";
}

Ето ти и демо да видиш, че работи, ако и ТАКА не работи, пробвай да намериш в интернет това което ще ти свърши работа или САМ да се опиташ да го поправиш :)

http://www.phpliveregex.com/p/bNu :?:
 
Според мен ако наистина искаш да засичаш линкове, не трябва да следваш стриктно правилата за урл-та, защото всеки може да сложи едни спейсове около точките и ще заобиколи защитата:
www . site . com
не минава
Можеш да ползваш много по-опростен израз и да гледаш само за www-та и http-та като това:

PHP:
preg_match('/www|https?|ftp/i', $var);

Разбира се, това ще блокира всяко съобщение, съдържащо http и www, и така хем си опростяваш кода, хем намаляваш верятността от пропуски.

Това на joTunkiq ще бъде много полезно ако искаш дадена стойност да е точно линк, но в случая търсиш обратното - блокиране при най-малко съмнение за линк.

@joTunkiq, защо не ползваш \w вместо [a-zA-Z0-9-]? По-кратко е :)

А може и малко по-advanced защита срещу неща като w w w и h*t*t*p като например това:

PHP:
/(w.{0,2})\g{1}\g{1}/

Идеята е, че проверява за w и до 2 символа след това. Това вероятно няма да работи, в момента точно не се сещам как беше синтаксиса, по-късно ще погледна пак.
 
@dakata__92 Да, това е ясно като вариянт, предложихме му го, но той иска хем да го засича като е с https(s)/ftp/ала-бала и иска и като е с www или без и т.н. Като цяло не му е достатъчно само едното, така да се каже. И колега му каза направи да проверява дали може да мачне http:// или www., нали, като вариант.

@anonimen За да го объркам :D Не, шегувам се, просто така съм свикнал, много рядко ползвам тея съкратени варианти :oops: :D
 
https://regex101.com/r/wU1jO1/1
Ето един работещ вариант, който хваща всеки един от тези редове:

Код:
http://google.com/
w _*w**w.site.com
h t t p://
www.google.com
w w w . google . com
some text htt p s: // w*w*w*.*google*.c*o*m
another example: w__w_*w . badsite.*com
Както виждаш хваща до 3 символа между http-тата и www-тата.
Разбира се, няма как да хванеш урл-та без www и http, като например само google.com (просто защото не знаеш това урл ли е или част от обикновения текст), но все пак и това е защита. :?:
 
А защо не ползваш parse_url?
http://php.net/manual/en/function.parse-url.php
PHP:
$url = 'http://username:password@hostname:9090/path?arg=value#anchor';

if($is_url = parse_url($url)){
	print_r($is_url);
}else{
	echo 'Not url!';
}
Естествено ще трябва да си поиграеш с
Specify one of PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY or PHP_URL_FRAGMENT to retrieve just a specific URL component as a

Което те интересува и това е. Смисъл няма как да имаш хипер връзка без да и подадеш някакъв верен стринг. Можеш да го комбинираш като обходиш масива is_url и провериш всеки един стринг дали съвпада с някой от шаблоните ти и да си направиш втора защита.
PHP:
echo '<pre>';
$url = 'www.google.bg/path?arg=value#anchor';

if($is_url = parse_url($url)){
	print_r($is_url);
	if($matches = preg_grep('/h.{0,3}t.{0,3}t.{0,3}p(?:.{0,3}s)?|w.{0,3}w.{0,3}w/',$is_url)){
		print_r($matches);
	}else{
		echo 'Not url!';
	}
}else{
	echo 'Not url!';
}

echo '</pre>';

Използвам регулярният израз на анонимен. :) :?:
 
dakata__92 каза:
А защо не ползваш parse_url?
http://php.net/manual/en/function.parse-url.php
...
$message подсказва, че съдържа текст, в който евентуално има линк. Тоест може да бъде "Здравейте, отворете сайта ми www.example.com" и той иска да блокира това.

Както преди няколко поста писах, тези сложни проверки за истинско url вършат работа ако искаш да си сигурен, че подадената стойност е url, но в случая ти трябва обратното - затова според мен трябва да търсиш най-малкия намек за url, а не най-сигурното url.

+ Няма смисъл да ползваш
if(parse_url)
if(h*t*t*p)
защото parse_url ти гарантира, че има http, а не h*t*t*p, ако ме разбираш :?:
 
Аз преди за това нещо ползвах следното:
Код:
if( strstr($message, 'http:') ||  strstr($message, 'www.'))
{
  echo "ne trqbwa da ima URL-i";
}
И вършеше работа, но като цяло няма как да си 100% сигурен, че няма урл в съобщението ти, но можеш да се засече на 60-70% с някой код от @anonimen или @dakata__92. Другото, което аз мога да предложа като вариянт е да го замаскираш(или пък направо да го премахнеш).

Примерно: хттп://сайтами.цом/?Сд=123 -> хтттп://с*****/?Сц=123
Това става с регулярен израз пак :) :?:
 
joTunkiq, както вероятно си виждал, хората пускат и линкове от рода
Код:
www . site . com
Затова е по-добре да проверяваш само за www, без точка след това.
А най-добре, както показах, да гледаш и за
Код:
w w w / htt p / w__w__w / h`t`t`p
и други подобни.

+ между другото в документацията за strstr пише
http://php.net/str%20str каза:
If you only want to determine if a particular needle occurs within haystack, use the faster and less memory intensive function strpos() instead.
 

Back
Горе