1

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

我正在尝试从网页表中提取“端口号”列表及其各自的“IP 地址”。并且因为它是一个使用 AJAX 和 PHP 的东西来生成动态内容的动态网页,所以所有的表格元素都没有任何 id 或 class 或任何独特的东西。我已经消除了所有/t, /r and /nusing str_replace,整个内容只包含单词和空格。

以下是端口和 ip addr 的示例:

端口 - Fa0/0、Gi1/0/2.100、Ethernet01、GigaEther-01(包含大小写、点、破折号、斜线和数字,不能超过 16 个字符,不能有空格)

IP adrr - 123.123.123.123, 1.1.12.12, 123.12.1.1(与普通ip addr没有区别)

但幸运的是,所有“端口”和“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>...

我相信端口/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>

因为(.*)将考虑 a<img....>和 a之间的任何内容</td>作为有效匹配

而且,我只尝试了特定的 IP 地址正则表达式,$pattern = "/\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/";

它只向我返回 IP 地址(如 111.22.3.119),但不幸的是,网页中的某些链接 url 也包含我不想要的 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>/";了,它有效,不知道为什么,但仍在想办法解决端口正则表达式....

4

1 回答 1

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>#';
于 2013-07-25T19:30:30.703 回答