Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从字符串中提取子字符串的regex global_Php_Regex - Fatal编程技术网

Php 从字符串中提取子字符串的regex global

Php 从字符串中提取子字符串的regex global,php,regex,Php,Regex,我试图从标准Oracle连接字符串中提取FQDN和端口号。 我已经了解了如何分别提取FQDN和端口,但我正在寻找一个php regexp,它允许我同时提取所有FQDN和端口 连接字符串示例: (DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN1)(PORT=1234))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN2)(PORT=5678))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN

我试图从标准Oracle连接字符串中提取FQDN和端口号。 我已经了解了如何分别提取FQDN和端口,但我正在寻找一个php regexp,它允许我同时提取所有FQDN和端口

连接字符串示例:

(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN1)(PORT=1234))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN2)(PORT=5678))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN3)(PORT=9012))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN4)(PORT=3456)))(CONNECT_DATA=(SERVICE_NAME=STUFF)))
我的预期结果将是一个数组:

[0][0] => FQDN1, [0][1] => 1234, 
[1][0] => FQDN2, [1][1] => 5678, 
[2][0] => FQDN3, [2][1] => 9012, 
[3][0] => FQDN4, [3][1] => 3456
谢谢你们的帮助


谢谢。

您可以像这样使用preg\u match\u:

if (preg_match_all('~HOST=([^)\s]+).*?PORT=([^)\s]+)~', $str, $arr))
   print_r($arr);
现场演示: 使用PREG_SET_ORDER按您想要的方式排列它们。然后轮班结束整场比赛

只要有可能,您应该阅读以下文档:

试试这个:

$subject = <<<LOD
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN1)(PORT=1234))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN2)(PORT=5678))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN3)(PORT=9012))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN4)(PORT=3456)))(CONNECT_DATA=(SERVICE_NAME=STUFF)))
LOD;

$pattern = '~\(HOST=([^)]+)\)\(PORT=(\d+)\)~';

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);

// removes the whole match (index 0) for each result to only let the capture groups
foreach ($matches as &$match) {
    array_shift($match);
}

$subject=这就是我需要的,尽管我不明白为什么数组的第0个索引包含整个主机=…)(端口=…并且我的数据位于索引位置1和2。我本以为我的数据将位于索引0处。尽管如此,这还是满足了我的需要。@LegioX:根据preg_match_all:
的PHP手册对结果进行排序,以便$matches[0]是一个完整模式匹配的数组,$matches[1]是一个字符串数组,由第一个括号中的子模式匹配,依此类推。
请参见:我希望我能对所有正确答案打勾,但我只允许打一个勾。您的模式还提供了必要的信息。我在阅读PREG_match_时忽略的PREG_SET_顺序是锦上添花。谢谢u、 该模式实际上是渲染空白。我已经阅读了preg_match_all函数,但是我忽略了preg_SET_ORDER标志。非常感谢您提供了一个可能的解决方案。我感谢所有的帮助。我花了一整天的时间修补我的正则表达式,但无法使其正常工作。
$subject = <<<LOD
(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN1)(PORT=1234))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN2)(PORT=5678))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN3)(PORT=9012))(ADDRESS=(PROTOCOL=TCP)(HOST=FQDN4)(PORT=3456)))(CONNECT_DATA=(SERVICE_NAME=STUFF)))
LOD;

$pattern = '~\(HOST=([^)]+)\)\(PORT=(\d+)\)~';

preg_match_all($pattern, $subject, $matches, PREG_SET_ORDER);

// removes the whole match (index 0) for each result to only let the capture groups
foreach ($matches as &$match) {
    array_shift($match);
}