使用preg_match从字符串中提取IP和javascript字符串

时间:2011-11-26 09:53:29

标签: php regex

我希望能够提取IP和其他一些文本但我无法做到!!在正则表达式中非常糟糕:(

这是我到目前为止所尝试的内容:

$string='<td>189.3.215.146<script type="text/javascript">document.write(":"+h+g+h+g)</script>';



preg_match_all("|<td>([.]{1,3}\.[.]{1,3}\.[.]{1,3}\.[.]{1,3})</[^>]+>document\.write\(\":\"([^)]+)\)</script>|U",
    $string,
    $out, PREG_PATTERN_ORDER);
    print_r($out);

由于某种原因它不起作用:(

编辑: 我想从+h+g+h+g

中提取document.write(":"+h+g+h+g)

2 个答案:

答案 0 :(得分:2)

你的正则表达式:

|<td>([.]{1,3}\.[.]{1,3}\.[.]{1,3}\.[.]{1,3})</[^>]+>document\.write\(\":\"([^)]+)\)</script>|U

与您想要的不符,这是一个解释:

<td>                     : match <td>
(                        : start capture group 1
[.]{1,3}\.               : one to three dots followed by a dot
[.]{1,3}\.               : same
[.]{1,3}\.               : same
[.]{1,3}                 : one to three dots
              ### all this can be simplify by: \.{7,15} : 7 to 15 dots !!!
              ### this is not what you want.

)                        : end of capture group 1
<                        : <
/                        : /
[^>]+                    : one or more chars NOT >
>                        : >
document\.write\(\":\"   : document.write(":"
(                        : start capture group 2
[^)]+                    : one or more chars NOT )
)                        : end of capture group 2
\)                       : )
</script>                : </script>

我会这样做:

|<td>(\d{1,3}(?:\.\d{1,3}){3}).+?document\.write\(\":\"([^)]+)\)</script>|

使用这个,您将检索组1中的IP地址和组2​​中的+ h + g + h + g

<强>解释

<td>                      : <td>
(                         : start capture group 1
\d{1,3}                   : 1 to 3 digits
(?:                       : start NON capture group
\.\d{1,3}                 : a dot followed by 1 to 3 digits
){3}                      : end NON capture group, must appear 3 times
)                         : end capture group 1
.+?                       : any number of any char NOT greedy
document\.write\(\":\"    : document.write(":"
(                         : start capture group 2
[^)]+                     : one or more chars NOT )
)                         : end capture group 2
\)                        : )
</script>                 : </script>

答案 1 :(得分:1)

假设您只有这种文本,这里有一些示例正则表达式:

<?php

$string='<td>189.3.215.146<script type="text/javascript">document.write(":"+h+g+h+g)</script>';

$ips = array();
preg_match_all('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $string, $ips);

$writes = array();
preg_match_all('/document.write\(([^)]+)\)/', $string, $writes);

print_r($ips);
print_r($writes);

你可以将它全部放在一个正则表达式中,但我认为这样更清楚。

编辑:以防万一你喜欢它,这里有一种方法可以用一个正则表达式(真的更多)

<?php

$string = '<td>189.3.215.146<script type="text/javascript">document.write(":"+h+g+h+g)</script>';

$ipRegex    = '(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})';
$writeRegex = 'document.write\(([^)]+)\)';
$matches    = array();
preg_match_all("/$ipRegex.*$writeRegex/", $string, $matches);

print_r($matches);