我希望能够提取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)
答案 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);