preg_match_all表现得很奇怪

时间:2014-03-27 15:45:09

标签: php arrays curl preg-match-all

我正在尝试使用preg_match_all从页面获取1个值,我在线尝试(phpliveregex.com),但是当我将它放在我的php脚本中时,它会返回一个空数组(print_r)

这是我正在运行的php代码:

preg_match_all("/(?<=\<td align\=\"right\"\>\$).*(?=\<\/td\>)/", $PageProfit, $profit);
print_r($profit);

//Select 1st of array
$profit = $profit[0][0];
echo $profit;

这是$ PageProfit

的一部分
</center><p>&nbsp;</p>
     <table align="center" cellpadding="2" cellspacing="0">
     <tr class="membertdbold"><td align="center">Date</td>
     <td align="center">Buyer</td>
     <td align="center">Product</td>
     <td align="center">Commission</td>
     <td align="center">Status</td>
     </tr><tr>
        <td align="center">2014-03-14 21:29:41</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-15 18:26:20</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-16 19:50:15</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-17 19:48:12</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-18 19:56:14</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-19 20:52:07</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-20 21:02:07</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-21 21:34:05</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-22 21:46:07</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-23 22:00:07</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-24 22:06:07</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-25 23:00:12</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-26 23:30:07</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr>
        <td align="center">2014-03-27 09:08:10</td>
        <td align="center">N/A</td>
        <td align="center">PTC</td>
        <td align="center">0.123</td>
        <td align="center">Unpaid</td>
        </tr><tr class="formlabelbold">
        <td colspan="3" align="right">Total Owing:</td>
        <td align="right">$1.234</td>
        </tr><tr><td colspan="4" >&nbsp;</td></tr></table>
</div></td></tr>
</table>

PHP版本返回的位置:

Array ( [0] => Array ( ) )

并且网站返回: 数组([0] =&gt;数组([0] =&gt; 1.234))

据我所知,我没有遗漏任何错误,也没有E_ALL的警告。有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

在PHP中,使用$some_var美元符号将字符串/数字变量声明为$。如果将它们放在双引号(&#34;)中,它仍将其解释为变量。例如:

$some_var = "xyz";
print "$some_var"; // outputs : xyz

但是,如果在变量之前使用\,它会转义$符号并输出变量名称。例如这一个。

print "\$some_var"; // outputs : $some_var

注意,上面一行没有打印\$some_var。要在那里打印另一个斜杠,你必须放置另一个带有转义(\\)的斜杠。

print "\\\$some_var"; // outputs : \$some_var

这就是为什么在正则表达式中,在双引号内,\$简单解释为$

所以你在这个阶段有几个解决方案。

  • 在正则表达式上使用\\。所以它将是\\\$
  • 将整个正则表达式放在单引号(')中,如'/...../'
  • $放置在角色类[]内,这样[$]

答案 1 :(得分:0)

这真的很奇怪......似乎美元符号无法正常逃脱。 您可以像这样修改正则表达式:

preg_match_all("/(?<=\<td align\=\"right\"\>[$]).*(?=\<\/td\>)/", $PageProfit, $profit);