2012-02-20 1 views
0
/<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" из всей разобранной строки. Может ли кто-нибудь помочь мне понять, что я сделал неправильно?Как я могу получить строку между некоторыми тегами, но ПЕРЕД "</table>", с регулярным выражением?

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

Edit: Кроме того, что я на самом деле хочу это <td> что перед первым </table> тега.

+1

Вы действительно должны использовать синтаксический анализ xml для этого. Строковые операции с регулярным выражением должны быть последним решением, о котором вы думаете. И XML-анализ с php не настолько сложный. – Corubba

+1

Я знаю, но я потратил неделю, пытаясь заставить его работать с XML, в то время как это регулярное выражение заняло у меня всего 2 дня (без предыдущего опыта). – Bogdacutu

+0

Можете ли вы привести пример xml? – Corubba

ответ

-2

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

0

Этот простой узор

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

Ура!

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

  • Нет связанных вопросов^_^