0
У меня есть некоторые HTML, который выглядит следующим образом:Извлечение из каждого первого TD в таблице
<tr class="row-even">
<td align="center">abcde</td>
<td align="center"><a href="deluserconfirm.html?user=abcde"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
<tr class="row-odd">
<td align="center">efgh</td>
<td align="center"><a href="deluserconfirm.html?user=efgh"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
<tr class="row-even">
<td align="center">ijkl</td>
<td align="center"><a href="deluserconfirm.html?user=ijkl"><img src="../images/delete_x.gif" alt="Delete User" border="none" /></a></td>
</tr>
И мне нужно, чтобы получить значения, abcde
, efgh
и ijkl
Это регулярное выражение, которое я использую в настоящее время:
preg_match_all('/(<tr class="row-even">|<tr class="row-odd">)<td align="center">(.*)<\/td><\/tr>/xs', $html, $matches);
Да, я не очень хорош в них. Как и в большинстве моих попыток регулярного выражения, это не работает. Может ли кто-нибудь сказать мне, почему?
Кроме того, я знаю о парсерах html/xml, но для этого потребуется значительный пересмотр кода. Так вот на потом. На данный момент нам нужно придерживаться регулярного выражения.
EDIT: Чтобы уточнить, мне нужно значение между первым <td align="center"></td>
тегом либо после <tr class="row-even">
или <tr class="row-odd">
Я не так хорош с регулярным выражением, но может быть, вы не заметили, что вам не хватает части для разрыва строки между '
, пожалуйста, сообщите нам, что вы хотите сделать точно? Какова функция этого? – klox
@JohnoBoy: Как я могу ввести строки? @klox: Мне нужны значения между первым тегом
ответ
Обратите внимание на
m
модификатора и использование\s*
.Кроме того, вы можете сделать первую группу без захвата с помощью
?:
. Т.е.,(?:even|odd)
, как вы, вероятно, не заинтересованы в атрибутеclass
:)источник
2010-10-19 07:31:15 jensgram
Наконец-то! Кто-то не спорит с regex v/s html parsers! Я попробовал, и он отлично работает. Просто некоторые разъяснения, пожалуйста, я попробовал \ s раньше, и это не сработало с *. Почему это необходимо? Кроме того, что делают персонажи? – HyderA
В PHP вы можете использовать любой символ, чтобы отметить начало и конец вашего регулярного выражения. Он выбрал '' 'для удобства. «*» - квантификатор. Вы используете его, чтобы сказать, что вы хотите от 0 до бесконечности определенного класса. '\ s' в вашем случае, что означает пробельные символы. –
@gAMBOOKa Что @Alin Purcaru сказал :) '~' выбирается, так как он не используется нигде в моем шаблоне. Вы часто видите '/', используемый в качестве разделителя, но это заставило бы меня избежать этого '\ /' в '
Это просто быстрое и грязное регулярное выражение, чтобы удовлетворить ваши потребности. Его можно легко очистить и оптимизировать, но это начало.
Вот альтернативный способ, который может быть более надежной:
источник
2010-10-19 07:29:48 Swiss
Это то, что я придумал
я объясню. Одна из проблем заключается в том, что между тегами может быть либо текст, который вы ищете, либо тег. В регулярном выражении [^ <] + говорит, чтобы соответствовать одному или нескольким символам, которые не символ <. Это здорово, потому что это означает, что не будет соответствовать, и группа будет соответствовать только до тех пор, пока тег не будет найден.
источник
2010-10-19 07:34:39 mellowsoon
Только что заметил, что в моем ответе мои якорные метки были удалены. – mellowsoon
Попробуйте это:
Внесены изменений:
.*?
вместо.*
.Working link
источник
2010-10-19 07:36:22 codaddict
Спасибо, что указали мои точные ошибки. Помогает мне учиться! – HyderA
Отказ от ответственности: Использование регулярных выражений для разбора HTML опасно.
Чтобы получить innerhtml первого TD в каждом TR, используйте регулярное выражение:
источник
2010-10-19 07:36:25 W3Coder
На самом деле, вам не нужно слишком большие изменения в вашем коде. Извлечение текстовых узлов всегда одинаково с DOM и XPath. Все, что делает изменения, это XPath, поэтому вы можете обернуть DOM-код в функцию, которая заменяет ваш
preg_match_all
. Это будет всего лишь небольшое изменение, например.где dom.php содержит только:
и вернется
Но если вы хотите Regex, использовать Regex. Я просто даю идеи.
источник
2010-10-19 07:46:37 Gordon
Я ценю ваши усилия, и это действительный ответ, за исключением того, что в моем случае это намного сложнее. Я планирую использовать библиотеку simplehtmldom, которую я нашел довольно гладкой. Это приложение по всем практическим причинам, искатель. Таким образом, на протяжении всей заявки существует множество регулярных выражений. Простое включение новой библиотеки - это усилие, потому что нет класса интеграции центральной библиотеки. У меня будет несколько копий кода на всей кодовой базе, если я повторно использую текущую архитектуру. Но я вижу вашу точку зрения, и я уверен, что это поможет кому-то найти подобное решение. – HyderA
@gAMBOOKa без проблем. Вы также можете быть заинтересованы в [Лучшие методы анализа HTML] (http://stackoverflow.com/questions/3577641/best-methods-to-parse-html/3577662#3577662). ИМО там лучше библиотеки, чем SimpleHTMLDom. – Gordon
Смежные вопросы