如何使正则表达式识别单词的特定模式

时间:2013-07-25 19:14:02

标签: php regex ip-address port-number

我的正则表达式很差,但出于某种原因,我别无选择,只能使用它。

我正在尝试从网页表中提取“端口号”列表及其各自的“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>/";,它有效,不知道为什么,但仍然在想如何解决端口正则表达式....

1 个答案:

答案 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>#';