我的正则表达式很差,但由于某种原因,我别无选择,只能使用它。
我正在尝试从网页表中提取“端口号”列表及其各自的“IP 地址”。并且因为它是一个使用 AJAX 和 PHP 的东西来生成动态内容的动态网页,所以所有的表格元素都没有任何 id 或 class 或任何独特的东西。我已经消除了所有/t, /r and /n
using 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>/";
了,它有效,不知道为什么,但仍在想办法解决端口正则表达式....