开发者

RegExp PHP get text between multiple span tags

I don't speak English very well. So, if i'll make some mistake please sorry.

On the site i have a div box with some information about game:

<span class="noteline">Developer:</span> 
<span class="subline">Gameloft</span> 
<span class="noteline">Genre:</span> 
<span class="subline">Racing/Arcade</span> 
<span class="noteline">Release year:</span> 
<span class="subline">2010</span> 

I need to get the information between <span class="noteline"> and it's closing tag </span>

preg_match("/\<span\sclass=\"subline\"\>(.*)<\/span\>/imsU", $source, $matches);

the solution above works fine but it only gets the "subline" with text "gameloft";

but i need also sublines that have text Racing/Arcade and 2010;

Maybe something like this (that doesn't wor开发者_如何学Ck);

for developer = preg_match("/*(\<span\sclass=\"subline\"\>){1}*(.*)*(<\/span\>){1}*/imsU", $source, $matches);
for genre = preg_match("/*(\<span\sclass=\"subline\"\>){2}*(.*)*(<\/span\>){2}*/imsU", $source, $matches);

something like this..

Anyway. Thanks for any help.


An alternative to regexps would be to use phpQuery or QueryPath, which simplifies it to:

foreach ( qp($source)->find("span.subline") as $span ) {
    print $span->text();
}


Regular expressions are not appropriate to parse HTML. They are difficult to get right and they always break in edge cases.

I don't know if there's an easier way but this should work with the markup you describe:

<?php

$fragment = '<span class="noteline">Developer:</span>
<span class="subline">Gameloft</span>
<span class="noteline">Genre:</span>
<span class="subline">Racing/Arcade</span>
<span class="noteline">Release year:</span>
<span class="subline">2010</span>';

libxml_use_internal_errors(TRUE);
$dom = new DOMDocument();
$dom->loadHTML($fragment);
$xml = simplexml_import_dom($dom);
libxml_use_internal_errors(FALSE);

foreach($xml->xpath("//span[@class='subline']") as $item){
    echo (string)$item . PHP_EOL;
}

This assumes class="subline" so it'll fail with multiple classes. (New to Xpath so improvements welcome.)


Try this:

preg_match_all("/<span class=\"subline\".*span>/", $html, $matches);

preg_match_all("/<span class=\"noteline\".*span>/", $html, $matches);

I tried the above code this way:

<?php 

$html = '<span class="noteline">Developer:</span> 
<span class="subline">Gameloft</span> 
<span class="noteline">Genre:</span> 
<span class="subline">Racing/Arcade</span> 
<span class="noteline">Release year:</span> 
<span class="subline">2010</span>';

preg_match_all("/<span class=\"subline\".*span>/", $html, $matches1);

preg_match_all("/<span class=\"noteline\".*span>/", $html, $matches2);

print_r($matches1);
echo "<br>";
print_r($matches2);

?>

The output I got was this:

Array ( [0] => Array ( [0] => Gameloft [1] => Racing/Arcade [2] => 2010 ) )
Array ( [0] => Array ( [0] => Developer: [1] => Genre: [2] => Release year: ) ) 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜