найди ip в txt содержании php - PullRequest
0 голосов
/ 03 мая 2011

У меня есть текстовый файл: ban.txt имеет содержимое

a:5:{i:14528;s:15:" 118.71.102.176";i:6048;s:15:" 113.22.109.137";i:16731;s:3:"  118.71.102.76";i:2269;s:12:" 1.52.251.63";i:9050;s:14:"123.21.100.174";}

Я пишу скрипт, чтобы найти и забанить IP в этом тексте

<?php
$banlist = file("ban.txt");

foreach($banlist as $ips ) {

    if($_SERVER["REMOTE_ADDR"] == $ips) {
        die("Your IP is banned!");
    }
}
?>

Может помочь мне перечислить IP в этом контенте, я новичок php. Большое спасибо

1 Ответ

2 голосов
/ 03 мая 2011

Смотри это признанное дерьмовое решение, основанное на неясном вопросе

Regex никогда не кажется отличным решением, но я не очень подробно рассказываю, насколько согласован файл.

1. Изолируйте сегменты "s" в вашем бане. Txt

Как таковой, и мое регулярное выражение не является фантастическим, но это регулярное выражение должно соответствовать сегментам "s", которые, по-видимому, предназначены для запретов IP (хотя ваш комментарий о том, что "IP всегда в" ip "" немного смущает это) .

Regex: s:[0-9]+:"[ ]*[0-9]+.[0-9]+.[0-9]+.[0-9]+";

2. Изолировать IP-адреса в каждом сегменте "s"

Получив эти сегменты, мы можем обрезать начальный бит до фактического IP-адреса (то есть превратить s:123:"192.168.0.0"; в 192.168.0.0";), а затем обрезать конечную кавычку и точку с запятой (т. Е. 192.168.0.0"; до 192.168.0.0):

Regex for start junk (still need to trim end): s:[0-9]+:"[ ]*
Regex for end junk: [";]+

3. Пример кода

Это даст нам этот код PHP:

$banText = file_get_contents("ban.txt"); 

/* Evil, evil regexes */
$sSegmentsRegex = '/s:[0-9]+:"[ ]*[0-9]+.[0-9]+.[0-9]+.[0-9]+"/';
$removeStartJunkRegex = '/s:[0-9]+:"[ ]*/';
$removeEndJunkRegex = '/[";]+/'; /* Could use rtrim on each if wanted */

$matches = array();

/* Find all 's' bits */
preg_match_all($sSegmentsRegex, $banText, $matches); 
$matches = $matches[0]; /* preg_match_all changes $matches to array of arrays */

/* Remove start junk of each 's' bit */
$matches = preg_replace($removeStartJunkRegex, "", $matches); 
$matches = preg_replace($removeEndJunkRegex, "", $matches); 

foreach($matches as $ip) {
    if($_SERVER["REMOTE_ADDR"] == $ip) {
        die("Your IP is banned!");
    }
 }

print_r($matches); /* Shows the list of IP bans, remove this in your app */

Пример: http://codepad.viper -7.com / S9rTQe

...