Как взять имя в одном preg_match - PullRequest
0 голосов
/ 16 апреля 2010

Я пытаюсь извлечь только имена, полученные из гипотетического HTML-файла ниже.

<ul class="cat">
<li>sport</li>
<li>movie</li>
</ul>
<ul class="person-list">
<li>name 1</li>
<li>name 2</li>
<li>name 3</li>
<li>name 4</li>
<li>name 5</li>
<li>name 6</li>
</ul>

В идеале, результат должен быть в формате массива, подобном приведенному ниже: Array ( имя 1, имя 2, имя 3, .......... )

Хорошо, я могу легко сделать это с двумя матчами регулярных выражений, но мне было интересно, могу ли я сделать это только с одним.

Ответы [ 3 ]

0 голосов
/ 16 апреля 2010

$pattern = '/<ul class=\"person\-list\">\s*(<li>(.*?)<\/li>)*\s*<\/ul>/ms'; preg_match_all($pattern, $TXT, $array); echo '<pre>', print_r($array, true), '</pre>';

0 голосов
/ 16 апреля 2010

Вот пример сценария Perl для этого. Предполагая, что ваш HTML находится в my.html

open FILE, "<", "my.html" or die $!;
my @arr;
while (my $line = <FILE>) {
  if ($line =~ /<li>\s*(name[^>]+)<\/li>/) {
     push(@arr, $1);
  }
}
print "Array (@arr)\n";

Пояснение - каждая строка html-файла читается в $ line, а затем мы используем регулярное выражение

/<li>\s*(name[^>]+)<\/li>/

чтобы увидеть, соответствует ли текущая строка тому, что мы хотим (то есть строка «имя, за которым следуют некоторые символы», заключенная в теги li). Одновременно подстрока «имя, сопровождаемое некоторыми символами» заносится в обратную ссылку. Если мы находим соответствие, захваченная строка добавляется в массив.

0 голосов
/ 16 апреля 2010

Это было бы намного проще и надежнее с использованием HTML-парсера, такого как DOMDocument. Регулярные выражения - плохой инструмент для разбора HTML, потому что HTML не является обычным языком . Попробуйте что-то вроде:

$html = <<<END
<ul class="cat">
<li>sport</li>
<li>movie</li>
</ul>
<ul class="person-list">
<li>name 1</li>
<li>name 2</li>
<li>name 3</li>
<li>name 4</li>
<li>name 5</li>
<li>name 6</li>
</ul>
END;
$dom = new DOMDocument;
$dom->loadHTML($html);
$xpath = new DOMXpath($dom);
$items = $xpath->query("//li[starts-with(.,'name ')]/text()");
foreach ($items as $item) {
  echo $item->wholeText . "\n";
}

Выход:

name 1
name 2
name 3
name 4
name 5
name 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...