Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/229.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Perl到PHP的等价物:使用正则表达式提取字符串_Php_Regex_Perl - Fatal编程技术网

Perl到PHP的等价物:使用正则表达式提取字符串

Perl到PHP的等价物:使用正则表达式提取字符串,php,regex,perl,Php,Regex,Perl,这个Perl代码的PHP等价物是什么 my $html = '<tr class="aaa"><td class="bbb">111.111.111.111</td><td>443</td><td><div><span class="ccc"></span> example <span> example</span></div></td>&l

这个Perl代码的PHP等价物是什么

my $html = '<tr class="aaa"><td class="bbb">111.111.111.111</td><td>443</td><td><div><span class="ccc"></span> example <span> example</span></div></td></tr><tr class="aaa"><td class="bbb">222.222.222.222</td><td>443</td><td><div><span class="ccc"></span> example <span> example</span></div></td></tr>';

print "$1:$2\n" while $html =~ /class="aaa"><td class="bbb">(.*?)<\/td><td>(\d+)<\/td>/g;

环境:Windows7PHP5.5.12(WAMP v2.5)。

PHP函数
preg_match()
指示是否匹配。您只查看循环中的返回值,因此该条件将始终为真。这就是为什么你有一个无限循环

由于
preg_match
$matches
只提供一次匹配中的所有捕获组,因此与
if
一起使用时,只能获得第一个匹配

Perl代码在正则表达式匹配上有
/g
修饰符,这使得匹配是全局的。匹配运算符
=~
为每个匹配返回一个真值。它基本上是一个迭代器,因此
while
循环将遍历所有匹配,而不重复匹配,因此没有无限lop。然后使用匹配变量
$1
$2
显示结果。您需要使用来获得PHP中的全局匹配

首先需要匹配,然后使用匹配项迭代数组。因为第一个元素是完全匹配的,所以可以忽略它

preg_match_all('/td class=\"bbb\">(.*?)<\/td><td>(\d+)<\/td>/',$html,$out);
for ($i = 1; $i < count($out) - 1; $i += 2) {
    echo "$out[$i]:";
    echo $out[$i+1];
    echo "\n";
}
preg\u match\u all('/td class=\“bbb\”>(.*)(\d+/”,$html,$out);
对于($i=1;$i<计数($out)-1;$i+=2){
回声“$out[$i]:”;
回显$out[$i+1];
回音“\n”;
}

此代码将按您的要求执行。它使用
preg\u match\u all
作为


输出
221.86.2.163:443
221.86.2.163:443

到目前为止,您尝试了什么来实现这一点?这可能有助于我们理解您所面临的问题:)我尝试使用此代码,但它提供了无限循环:
while(preg\u match('/td class=\'bbb\'>(.*)(\d+)/,$html,$out)){echo“$out[1]:$out[2]\n”}
请回答您的问题并在那里添加PHP代码。这很难从评论中读到。另外,如果不是的话,它只给出一个结果。你应该看看并给出,我认为这会解决你的问题。不。我更改了echo
“$out\n”
回显“$match\n”但是
preg_match
只给出IP和端口之间的换行符的第一个匹配
preg_match_all
给出错误通知:数组到字符串对话bla bla bla bla。@tr0in查看我的更新。我需要阅读phpdoc的语法,因为我通常不使用php。foreach方法是错误的,我一开始没有看到regex中有两个匹配项。例如,
'td class=“bbb”>(.*)(\d+)
哪个regex@Borodin?@simbabque我看到了您的更新,但它是相同的。它给出了错误:注意:数组到字符串的对话bla bla bla。对于代码中的第三行和第四行-
$out[$i]
$out[$i+1]
。就是这样,解决了我的问题。预定顺序就是男人,没有它就不行D谢谢。From:“PREG_SET_ORDER-对结果进行排序,使$matches[0]是第一组匹配的数组,$matches[1]是第二组匹配的数组,依此类推。”起初,我尝试使用PHP简单HTML DOM解析器,我刮取了IP,但我无法访问端口。“没有[PREG_SET_ORDER],它无法工作“是的,没有该标志它也可以工作。”。如果您使用它,解包
$out
的内容会更简单,但所有信息都在那里。@Henders谢谢,我是新来的,我不知道“接受答案”。
111.111.111.111:443
222.222.222.222:443
preg_match_all('/td class=\"bbb\">(.*?)<\/td><td>(\d+)<\/td>/',$html,$out);
for ($i = 1; $i < count($out) - 1; $i += 2) {
    echo "$out[$i]:";
    echo $out[$i+1];
    echo "\n";
}