Получить последний <li>элемент из строки - PullRequest
1 голос
/ 20 января 2010

У меня есть строковая переменная, которая содержит много разметки HTML, и я хочу получить из нее последний элемент <li>. Я использую что-то вроде:

$markup = "<body><div><li id='first'>One</li><li id='second'>Two</li><li id='third'>Three</li></div></body>";

preg_match('#<li(.*?)>(.*)</li>#ims', $markup, $matches);
$lis = "<li ".$matches[1].">".$matches[2]."</li>";
$total = explode("</li>",$lis);
$num = count($total)-2;
echo $total[$num]."</li>";

Это работает, и я печатаю последний <li> элемент. Но я не могу понять, почему я должен вычесть последние 2 индекса массива $total. Обычно я бы вычитал только последний индекс, так как отсчет начинается с индекса 0. Что я пропустил?

Есть ли лучший способ получить последний <li> элемент из строки?

Ответы [ 6 ]

6 голосов
/ 20 января 2010

HTML не является регулярным, и поэтому не может быть проанализирован с помощью регулярного выражения. Используйте правильный HTML-парсер .

1 голос
/ 20 января 2010

Если вы уже знаете, как использовать jQuery, вы также можете взглянуть на phpQuery . Это библиотека PHP, которая позволяет вам легко получать доступ к элементам dom, как в jQuery.

1 голос
/ 20 января 2010

@ OP, ваше требование выглядит просто, поэтому нет необходимости в парсерах или регулярных выражениях.

$markup = "<body><div><li id='first'>One</li><li id='second'>Two</li><li id='third'>Three</li></div></body>";
$s = explode("</li>",$markup,-1);
$t = explode(">",end($s));
print end($t);

выход

$ php test.php
Three
0 голосов
/ 20 января 2010

strrpos - Найти позицию последнего появления символа в строке

0 голосов
/ 20 января 2010

Вы должны извлечь второй индекс, потому что у вас есть 2 группы захвата:

$matches[0]; // Contains your original string
$matches[1]; // Contains the argument for the LI start-tag (.*?)
$matches[2]; // Contains the string contained by the LI tags (.*)

«parsing» (x) HTML-строки с регулярными выражениями сложны и могут быть полны неожиданных проблем. анализ более простых теговых строк невозможен, потому что (x) html не является обычным языком.

Вы можете улучшить свое регулярное выражение, используя (не проверено):

 /#<li([^>]*)>(.+?)</li>#ims/
0 голосов
/ 20 января 2010

Из документации PHP.net:

If matches is provided, then it is filled with the results of search. $matches[0] will contain the text that matched the full pattern, $matches[1] will have the text that matched the first captured parenthesized subpattern, and so on.

$ совпадений [0] - полное совпадение (а не только захваченные биты)

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