Смотри это признанное дерьмовое решение, основанное на неясном вопросе
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