2010-12-29 6 views
2

Я не очень хорошо владею английским языком. Итак, если я ошибаюсь, прошу прощения.RegExp PHP получить текст между несколькими тегами span

На сайте у меня есть ящик Div с некоторой информацией об игре:

<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> 

Мне нужно, чтобы получить информацию между <span class="noteline"> и это закрывающий тег </span>

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

решение выше работает отлично но он получает только «сублину» с текстом «gameloft»;

, но мне также нужны сублины, которые имеют текст Racing/Arcade и 2010;

Возможно, что-то вроде этого (что не работает);

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); 

что-то вроде этого ..

Во всяком случае. Спасибо за любую помощь.

ответ

0

Попробуйте это:

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

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

Я попробовал приведенный выше код следующим образом:

<?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); 

?> 

Выход меня был этот:

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

Большое спасибо. Это кажется отличным решением. – Andy

1

Альтернативой регулярных выражений будет используйте phpQuery или QueryPath, что упрощает его до:

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

Регулярные выражения не подходят для разбора HTML. Их трудно добиться, и они всегда ломаются в крайних случаях.

Я не знаю, если есть более простой способ, но это должно работать с разметкой вы описываете:

<?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; 
} 

Это предполагает class="subline" так что потерпите неудачу с несколькими классами. (Новое для Xpath, поэтому улучшения приветствуются.)

+0

Просто то, что мне было нужно, не знал об этом классе DOMDocument, спасибо! – Tomatrox

Смежные вопросы