我的正则表达式很差,但出于某种原因,我别无选择,只能使用它。
我正在尝试从网页表中提取“端口号”列表及其各自的“IP地址”。因为它是一个动态网页,使用AJAX和PHP的东西来生成动态内容,因此所有表元素都没有任何id或类或任何独特的东西。我已使用/t, /r and /n
删除了所有str_replace
,其中整个内容仅包含字词和空格。
以下是port和ip addr的示例:
端口 - Fa0 / 0,Gi1 / 0 / 2.100,Ethernet01,GigaEther-01(包含大小写,点,短划线,斜线和数字,不应超过16个字符,不能有空格)< / p>
IP adrr - 123.123.123.123,1.1.12.12,123.12.1.1(与普通IP地址没有区别)
但幸运的是,所有“端口”和“IP地址”后面都有端口映像或ip映像。比如
...<img border='0' src='images/port.png' width='18' heigh='18'>Fa0/0</td>... OR
...<img border='0' src='images/ip.png' width='18' heigh='18'>1.1.1.1</td>...
我相信port / IP和img / td标签之间没有空格。因此,我可以将它用作提取它们的模式,因此我使用了以下模式:
港口 -
$pattern = "/<img border\='0' src='images\/port\.png' width\='18' height\='18'>([a-zA-Z0-9\/ _-]{1,15})<\/td>/";
IP地址 -
$pattern = "<img border\='0' src\='images\/ip\.png' width\='18' height\='18'>\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b <\/td>/";
然后是
preg_match_all($pattern, $content, $matches);
。
。
但他们两个都没有给我任何回报,然后我尝试了以下模式:
港口 -
$pattern = "/<img border\='0' src='images\/port\.png' width\='18' height\='18'>(.*)<\/td>/";
IP地址 -
$pattern = "<img border\='0' src\='images\/ip\.png' width\='18' height\='18'>(.*)<\/td>/";
...
但是这些模式会返回类似
的内容<img border\='0' src='images\/port\.png' width\='18' height\='18'>Fa0/0
<\/td>....(Followed by a bunch of unwanted text and code)
......<\/td>
因为(.*)
会将<img....>
和</td>
之间的任何内容视为有效匹配
而且,我只尝试了特定的IP地址正则表达式$pattern = "/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/";
它只向我返回IP地址(如111.22.3.119),但不幸的是网页中的某些链接网址也包含ip地址,这不是我想要的。
然后我尝试$pattern = "/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}<\/td>\b/";
,它什么也没有返回......
感谢任何愿意帮助我的人,谢谢。
*编辑1 *
我试过$pattern = "/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b<\/td>/";
,它有效,不知道为什么,但仍然在想如何解决端口正则表达式....
答案 0 :(得分:0)
$pattern1 = '#<img[^>]+>([a-z][\w./-]{1,16})</td>#i';
$pattern2 = '#<img[^>]+>([\d]{1,3}\.[\d]{1,3}\.[\d]{1,3}\.[\d]{1,3})</td>#';