0

hey guy,i'm a newbie in php and need some help from you guy in this preg_match_all function.
i would like to grab the multiple share data in this webpage for change,last trade,volume,trade time,open and so on.

this code only able to grab a single line of data, but not multiple as i mention above.
anyone can provide some guidance using this function?

<?php
$homepage = file_get_contents("http://finance.yahoo.com/q/ta?s=4707.KL+Basic+Tech.+Analysis&t=3m") ;
 if ($homepage === false)
  {   echo "content not found";
	}
 else { 
      preg_match("/<span id=\"yfs_l10_4707.kl\">(.*)<\/span>/", $homepage, $array) ;
      $nestle = $array[1];	
	}
				
        ?>

Edited by alanlai: n/a

2
Contributors
18
Replies
19
Views
6 Years
Discussion Span
Last Post by hielo
Featured Replies
  • 2

    You can use: [CODE] echo $item["label"] . ": " . $item["value"] . "<br />" ;[/CODE] OR: [CODE] echo "{$item['label']} : {$item['value']} <br />" ;[/CODE] (the {} forces the engine to evaluate a variable that is wrapped/embedded in a string.) Read More

0

download simple_html_dom.php:
http://simplehtmldom.sourceforge.net/

then try:

<?php
include("simple_html_dom.php");
$html=file_get_html("http://http://finance.yahoo.com/q/ta?s=4707.KL+Basic+Tech.+Analysis&t=3m");
$rows=$html->find('div[id=yfi_quote_summary_data] table tr');
$result=array();
foreach($rows as $row){
	preg_match('#([^:]+):(.+)#',strip_tags($row),$m);
	$result[]=array("label"=>$m[1],"value"=>$m[2]);
}
print_r($result);
?>

hey, i tried several time, the code seems like not working...
is it a mistake here?

("http://http://finance.yahoo.com/q/ta?s=4707.KL+Basic+Tech.+Analysis&t=3m");

i do ammend the http:// to one only...but seems like it still not working

0

It should be:
http://finance.yahoo.com/q/ta?s=4707.KL+Basic+Tech.+Analysis&t=3m

Are you sure it is including the file? Change:

include("simple_html_dom.php");

to:

require_once("simple_html_dom.php");

If it throws an error then you may have the wrong path to the file.

does this consider as correct output? Array ( [0] => Array ( [label] => Last Trade [value] => 43.80 ) [1] => Array ( [label] => Trade Time [value] => Nov 4 ) [2] => Array ( [label] => Change [value] => 0.10 (0.23%) ) [3] => Array ( [label] => Prev Close [value] => 43.90 ) [4] => Array ( [label] => Open [value] => 44.00 ) [5] => Array ( [label] => Bid [value] => 43.70 ) [6] => Array ( [label] => Ask [value] => 43.80 ) [7] => Array ( [label] => 1y Target Est [value] => N/A ) [8] => Array ( [label] => Day's Range [value] => 43.80 - 44.00 ) [9] => Array ( [label] => 52wk Range [value] => 32.40 - 45.00 ) [10] => Array ( [label] => Volume [value] => 1,600 ) [11] => Array ( [label] => Avg Vol (3m) [value] => 38,707 ) [12] => Array ( [label] => Market Cap [value] => N/A ) [13] => Array ( [label] => P/E (ttm) [value] => N/A ) [14] => Array ( [label] => EPS (ttm) [value] => N/A ) [15] => Array ( [label] => Div & Yield [value] => N/A (N/A) ) )

0

does this consider as correct output?

Yes, of course! It clearly shows you that $result IS an array with all the information you want. For example: echo $result[0]['label'] . ': '. $result[0]['value']; will give you the Last Trade information. If you want to see all the information, use a foreach:

foreach($result as $item)
{
  echo $item['label'] . ': '. $item['value'];
}

Edited by hielo: n/a

0

Yes, of course! It clearly shows you that $result IS an array with all the information you want. For .....

hey, hielo, if we want to insert a line break, why can't we write like this? it's keep consist of error.

foreach($result as $item)
{
  echo "$item["label"] . ": " . $item["value"]<br />" ;
	}

online tutorial example

foreach( $employeeAges as $key => $value)
{
	echo "Name: $key, Age: $value <br />";
}

Edited by alanlai: n/a

2

You can use:

echo $item["label"] . ": " . $item["value"] . "<br />" ;

OR:

echo "{$item['label']} :  {$item['value']} <br />" ;

(the {} forces the engine to evaluate a variable that is wrapped/embedded in a string.)

Edited by hielo: n/a

Votes + Comments
Nice answered hielo. thz guy
0

(the {} forces the engine to evaluate a variable that is wrapped/embedded in a string.)

oh,thanks a lot, it works !

btw,is it possible for us to get the content in the top gainer/loser section?
http://biz.thestar.com.my/marketwatch/

how we consider whether the content of website can be grabbed or not?

0

Line 4 of my FIRST post above has: $rows=$html->find('div[id=yfi_quote_summary_data] table tr'); which states: "within <div id='yfi_quote_summary_data'> locate all TABLE elements and within that every TR".

So you need to look at the markup you are working with and decide/determine what portions of HTML you are interested in. Look at the examples posted at the simplehtmldom page.

0

look at the HTML of the link above. You will notice that the information you want is in a <TABLE> .

So, from the tool I referred you to, you need to use: $html->find('table', SOME_INDEX) Now, I ask you, starting from the top, is THAT table (the one that contains the information you want) the FIRST table in the document? The SECOND? etc.

Whatever your answer is you need to subtract one and replace SOME_INDEX with the number you get (after subtracting one).

The reason for that is that find() will return an array, so the first table will be at index 0, the second table at index 1, etc.

Once you have the right table print it's innertext:

echo $html->find('table', YOU_FIGURE_OUT_THE_NUMBER_THAT_GOES_HERE)->innertext;

From the markup, it seems that all the info you want is within <B> tags, so you can refine your search further:

$data = $html->find('table', YOU_FIGURE_OUT_THE_NUMBER_THAT_GOES_HERE)->find('b')->innertext;

//now use a foreach to see what is in $data
0

From the markup, it seems that all the info you want is within <B> tags, so you can refine your search further:

ok,i was able to obtain the whole table,

echo $html->find('table', 0)->innertext;

but the table is not listing accordingly due to 1 line of code have been left out which is

<TABLE BORDER=0 CELLSPACING=0 CELLPADDING=3 WIDTH=95% STYLE="font-family:verdana, Arial, Helvetica; font-size:9pt"></table>

what we need is this code right?

Edited by alanlai: n/a

0

When you execute echo $html->find('table', YOU_FIGURE_OUT_THE_NUMBER_THAT_GOES_HERE)->innertext; it will give you everything INSIDE that table tag (NOT including the table tag itself). If you are getting everything inside, then it is working fine. You can add YOUR own opening and closing table tags: echo '<table id="gainersAndLosers">' . $html->find('table', YOU_FIGURE_OUT_THE_NUMBER_THAT_GOES_HERE)->innertext . "</table>";

Edited by hielo: n/a

0

hey,the code works perfectly! :)
by the way, is it possible for us to ammend the data we grab in innertext?
likewise,

<td align=LEFT><a href="s.asp?c=7164">KNM</a></td>

and i would like to rip off the "href" inside

<td align=LEFT>KNM</a></td>

is that possible?

0

use the strip_tags function:
http://php.net/manual/en/function.strip-tags.php

thanks,hielo! that strip_tags function is exactly what i need.
you are great, how you know every single function of PHP? :P

by the way, how we build an expandable sector just like "user contributed note" as php.net? any jargon for that?
i tried google search "expandable function php" but end up with nothing.

This question has already been answered. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.