I'm trying to get 1 value from a page using preg_match_all, I tried it online(phpliveregex.com) where it's working but when I place it in my php script, it returns a empty array(print_r)
This is the php code I'm running:
preg_match_all("/(?<=\<td align\=\"right\"\>\$).*(?=\<\/td\>)/", $PageProfit, $profit);
print_r($profit);
//Select 1st of array
$profit = $profit[0][0];
echo $profit;
And this is a part of $PageProfit
</center><p> </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" > </td></tr></table>
</div></td></tr>
</table>
Where the PHP version return:
Array ( [0] => Array ( ) )
and the website returns: Array ( [0] => Array ( [0] => 1.234 ) )
as far as I'm aware, I'm not missing anything, no errors and no warning with E_ALL. Can someone help me solve this problem?
It's really strange... it seems like the dollar sign does not escape properly. You could modify your regular expression like this:
preg_match_all("/(?<=\<td align\=\"right\"\>[$]).*(?=\<\/td\>)/", $PageProfit, $profit);
In PHP, string/number variables are declared as $some_var
using the $
dollar sign. If you place them inside the double quotes("), it still interpret that as a variable. For example:
$some_var = "xyz";
print "$some_var"; // outputs : xyz
But, if you use a \
before the variable, it escape the $
sign and prints the variable name instead. For example this one.
print "\$some_var"; // outputs : $some_var
Notice, the above line didn't print \$some_var
. To print another slash on there, you have to place another one with escaped (\\
).
print "\\\$some_var"; // outputs : \$some_var
That's why in your regex, inside the double quotes the \$
simple interpreted as $
.
So you have several solutions on this ocation.
\\
on your regex. So it will be \\\$
'
) like '/...../'
$
inside the character class []
, so it will be [$]