使用 php 执行 preg_match_all 时尝试存储接口
Trying to store interface when preg_match_all is executed using php
我只想存储接口名称。所以在这种情况下,我想存储 Interface900。下面是我的代码。似乎不知道该怎么做。
$str = '[TIMETRA-VRTR-MIB::vRtrIfName.22.178] => STRING: "interface900" ';
preg_match_all("!^STRING: \"?(.*?)\"?$!", $str, $matches))
print_r($matches);
也试过
preg_match_all('(STRING: ")([\w-_]*)', $str, $matches);
print_r($matches);
在这两种情况下,它都不会打印 Interface900。我不太擅长正则表达式或 php。有人可以帮我吗?
您的正则表达式不正确,应该是:
STRING: \"?(.*?)\"? $
STRING: \"? // Match the string 'STRING: ' followed by an optional double quote
(.*?) // Non-greedy capture anything until the next character in the pattern
\"? $ // Match an optional double quote followed by a space and the end of the string {$}
例子
preg_match_all("/STRING: \"?(.*?)\"? $/", $str, $matches);
print_r($matches);
/* Output:
Array
(
[0] => Array
(
[0] => STRING: "interface900"
)
[1] => Array
(
[0] => interface900
)
)
*/
preg_match("/STRING: \"?(.*?)\"? $/", $str, $matches);
print_r($matches);
/* Output:
Array
(
[0] => STRING: "interface900"
[1] => interface900
)
*/
为什么你的正则表达式失败
^STRING: \"?(.*?)\"?$
^ // Matches the start of the string {DOESN'T MATCH}
STRING: \"? // Match the string 'STRING: ' followed by an optional double quote
(.*?) // Non-greedy capture anything until the next character in the pattern
\"?$ // Match an optional double quote followed immediately by the end of the string {DOESN'T MATCH}
第二个模式在捕获组 2 中具有值。请注意 \w
也匹配下划线。
没有捕获组的更精确的模式可以断言关闭 "
并重复字符 class 至少 1 次以上以防止出现空匹配。
\bSTRING:\h+"\K[\w-]+(?=")
说明
\bSTRING:
匹配 STRING:
\h+"
匹配 1+ 个水平空白字符和 "
\K[\w-]+
重置匹配缓冲区,然后匹配 1+ 次单词字符或 -
(?=")
正向前瞻,断言"
直接向右
$re = '/\bSTRING:\h+"\K[\w-]+(?=")/';
$str = '[TIMETRA-VRTR-MIB::vRtrIfName.22.178] => STRING: "interface900" ';
preg_match_all($re, $str, $matches);
print_r ($matches[0]);
输出
Array
(
[0] => interface900
)
匹配整个字符串,您还可以考虑前导方括号,并匹配 1 个以上的单词字符,然后可选地重复 -
和 1 个以上的单词字符,以防止只匹配连字符。
您也可以使用捕获组,例如:
\[[^][]+\]\h+=>\h+STRING:\h+"(\w+(?:-\w+)*)"
我只想存储接口名称。所以在这种情况下,我想存储 Interface900。下面是我的代码。似乎不知道该怎么做。
$str = '[TIMETRA-VRTR-MIB::vRtrIfName.22.178] => STRING: "interface900" ';
preg_match_all("!^STRING: \"?(.*?)\"?$!", $str, $matches))
print_r($matches);
也试过
preg_match_all('(STRING: ")([\w-_]*)', $str, $matches);
print_r($matches);
在这两种情况下,它都不会打印 Interface900。我不太擅长正则表达式或 php。有人可以帮我吗?
您的正则表达式不正确,应该是:
STRING: \"?(.*?)\"? $
STRING: \"? // Match the string 'STRING: ' followed by an optional double quote
(.*?) // Non-greedy capture anything until the next character in the pattern
\"? $ // Match an optional double quote followed by a space and the end of the string {$}
例子
preg_match_all("/STRING: \"?(.*?)\"? $/", $str, $matches);
print_r($matches);
/* Output:
Array
(
[0] => Array
(
[0] => STRING: "interface900"
)
[1] => Array
(
[0] => interface900
)
)
*/
preg_match("/STRING: \"?(.*?)\"? $/", $str, $matches);
print_r($matches);
/* Output:
Array
(
[0] => STRING: "interface900"
[1] => interface900
)
*/
为什么你的正则表达式失败
^STRING: \"?(.*?)\"?$
^ // Matches the start of the string {DOESN'T MATCH}
STRING: \"? // Match the string 'STRING: ' followed by an optional double quote
(.*?) // Non-greedy capture anything until the next character in the pattern
\"?$ // Match an optional double quote followed immediately by the end of the string {DOESN'T MATCH}
第二个模式在捕获组 2 中具有值。请注意 \w
也匹配下划线。
没有捕获组的更精确的模式可以断言关闭 "
并重复字符 class 至少 1 次以上以防止出现空匹配。
\bSTRING:\h+"\K[\w-]+(?=")
说明
\bSTRING:
匹配STRING:
\h+"
匹配 1+ 个水平空白字符和"
\K[\w-]+
重置匹配缓冲区,然后匹配 1+ 次单词字符或-
(?=")
正向前瞻,断言"
直接向右
$re = '/\bSTRING:\h+"\K[\w-]+(?=")/';
$str = '[TIMETRA-VRTR-MIB::vRtrIfName.22.178] => STRING: "interface900" ';
preg_match_all($re, $str, $matches);
print_r ($matches[0]);
输出
Array
(
[0] => interface900
)
匹配整个字符串,您还可以考虑前导方括号,并匹配 1 个以上的单词字符,然后可选地重复 -
和 1 个以上的单词字符,以防止只匹配连字符。
您也可以使用捕获组,例如:
\[[^][]+\]\h+=>\h+STRING:\h+"(\w+(?:-\w+)*)"