RegExp PHP получить текст между несколькими тегами span - PullRequest
2 голосов
/ 29 декабря 2010

Я не очень хорошо говорю по-английски. Так что, если я сделаю ошибку, пожалуйста, извините.

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

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

как то так ..

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

Ответы [ 3 ]

1 голос
/ 29 декабря 2010

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

foreach ( qp($source)->find("span.subline") as $span ) {
    print $span->text();
}
1 голос
/ 29 декабря 2010

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

Я не знаю, есть ли более простой способ, но это должно работать с разметкой, которую вы описываете:предполагает class="subline", поэтому он потерпит неудачу с несколькими классами.(Впервые в Xpath, поэтому улучшения приветствуются.)

0 голосов
/ 29 декабря 2010

Попробуйте:

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: ) ) 
...