2

我目前正在寻找一种解决方案,我可以用它来确定选定的 IP 地址是否在字符串中,以将它们替换为private一词。我的问题是我不仅想替换始终相同的 IP,还想替换范围。

例如,我想找出一个字符串是否包含以 123 开头的 IP。如果是,请将 IP 地址更改为单词private

例子:

123.55.33.10
123.100.10.110
123.1.5.1

问题是我不知道确切的 IP 地址,只知道它们是如何开始的,所以我无法通过检查字符串长度等来审查它们。

下一个问题是我想替换各种 ip,例如以 123 开头的,然后是一些以 66 开头的,依此类推。因此,对于我的问题,如果您能帮助我提出一个基本上可以工作的解决方案,那就太好了:

$ips = array("123.","66.","112."); 

并且该解决方案基本上会检查一个字符串是否包含其中一个数组值,然后将 IP 替换为private一词- 但不仅仅是 123。而是任何可能的整体组合,意味着不仅仅是$string = str_replace("123.","",$string);

但是用私有替换整个IP地址

这个请求的原因:我正在为一所学校构建一个小脚本,我需要用单词private替换 IP ,因为搜索功能返回带有 IP 地址的结果,我不想在结果中显示它们。

该字符串可能如下所示:Hans 在 2012 年 12 月 10 日使用 IP 123.1.1.1 发布

所以我的任务是显示:汉斯在 2012 年 12 月 10 日以 IP私人发布

综上所述,无论字符串是:Hans 在 10.12.2012 上发布的 IP 123.112.12.1 或 Hans 在 10.12.2012 上发布的 IP 123.12.15.12 或 Hans 在 10.12.2012 上发布的 IP 123.24.0.100

该解决方案会将任何以我的数组中的值开头的 IP 替换为private

感谢您花时间阅读本文:)

编辑:

我用这个字符串尝试了解决方案,但它没有按预期工作:

<?php
$ip = "The date is 12.10.2012 and this ip 123.1.2.12 should not show but 144.100.1.11 should show while 66.122.11.9 should not show";
$ip = preg_replace('/^(123 | 66 | 112) \. [\d.]+$/x', "private", $ip);
echo $ip;
?>

最后应该显示的是:

日期是 12.10.2012,这个 ip private不应该显示,但是 144.100.1.11 应该显示,而private不应该显示

4

3 回答 3

1
$result = preg_replace(
    '/\b             # Start at a word boundary
    (?=              # Assert that the following can be matched:
     [^\d.]*         #  only digits or dots
     \b              #  followed by a word boundary, 
     (?:123|66|112)  #  then one of the three magic numbers
     \b              #  and another word boundary
    )                # End of lookahead
    \d{1,3}          # Match a number
    (?:\.\d{1,3}){3} # Match a dot and a number, three times
    \b               # End the match at a word boundary/x', 
    'private', $subject);

这不会对 IPv4 地址的有效性进行完整性检查;它也会匹配999.123.999.999。但如果有必要,可以很容易地引入这种检查。

于 2012-10-06T18:00:25.007 回答
0

您可能有兴趣了解explodein_array

$private_ips = ["123", "66", "112"];

in_array(explode('.', $ip)[0], $private_ips) 
    && $ip = 'private'
    ;

echo $ip;
于 2012-10-06T17:20:39.253 回答
0

也可以为此使用正则表达式,当然也可以使用单行。

 $ip = preg_replace('/^(123 | 66 | 112) \. [\d.]+$/x', "private", $ip);

虽然正则表达式只比较第一个数字,但它也可以将 IP 字符串的其余部分与 匹配[\d.]+,从而替换所有内容以防万一。

于 2012-10-06T17:24:51.643 回答