Как я могу получить строку между некоторыми тегами, но ДО "</table>", с регулярным выражением? - PullRequest
0 голосов
/ 20 февраля 2012
/<table[\s]+cellspacing="0"[\s]+class="cj(?:.*?)"[\s]+id="(?:.*?)">(?:.*?)value="(.*?)"(?:.*?)<td[\s]+class="dep">(.*?)<\/td>(?:.*)(?:<td[\s]+class="arr">(.*?)<\/td>)+(?:.*?)<\/table>/

Это моя текущая строка регулярных выражений, используемая в PHP с preg_match_all(). Я заменил (?:.*?) на (?:.*), чтобы вместо первого <td> с class="dep" он получил последний. Теперь это работает отлично, если только не существует более одной таблицы, и в этом случае он получает последние <td> с class="dep" из всей проанализированной строки. Может кто-нибудь помочь мне понять, что я сделал не так?

Кроме того, я знаю, что должен был использовать синтаксический анализ XML, но он показался мне слишком сложным: P

Редактировать: Кроме того, на самом деле мне нужен <td> перед первым </table> тегом.

Ответы [ 2 ]

0 голосов
/ 13 марта 2012

Этот простой шаблон

$pattern = "#<table\s.*?>.*?<td\s.*?class=[\"']dep[\"'].*?>(.*?)</td>.*?</table>#i";

возвращает данные из первой соответствующей пары <td...class="dep"...> и </td> тегов изнутри КАЖДАЯ таблица в строке темы (не имеет значения, сколько таблиц у вас есть).

Это поиск без учета регистра, который также сопоставляет одинарные и двойные кавычки вокруг имени класса (class="dep" или class='dep').

Примечание: если у вас больше <TD> тегов с class="dep" внутри одной таблицы, этот шаблон возвращает данные с первого появления пары TD с этим классом.

пример кода будет выглядеть так

$pattern = "#<table\s.*?>.*?<td\s.*?class=[\"']dep[\"'].*?>(.*?)</td>.*?</table>#i";
$document = ''; // put here your subject string
preg_match_all($pattern, $document, $results);
print_r($results[1]);

Ура!

0 голосов
/ 20 февраля 2012

Закончилось исправление, получив таблицу с одним регулярным выражением, а затем проанализировав ее содержимое с другим.

...