Регулярное выражение

Ярослав

Новичок
Регулярное выражение

Здравствуйте.
Вот пишу свою первую регулярку. Для проверки мыла всегда копировал. До этого времени как то не приходилось их писАть, что даже странно :) Но вот этот момент наступил.
Значит мне нужно вытащить из $str чему равен class, align и собственно текст(могут быть также теги a, img... любые) меджу тегами td.

PHP:
<?php
$str = '<td class="notesContent1">Examen</td>
        <td class="notesContent2">&nbsp;</td>
        <td class="notesContent3">&nbsp;</td>
        <td class="notesContent4">&nbsp;</td>
        <td class="notesContent5">100</td>
        <td class="notesContent6">Exesa</td>
        <td class="notesContent7">sdasfasfdasdfadfdfasdf</td>
        <td align="center" class="notesContentEnd8"><a href="javascript:load_value(\'course_result\',\'164\',\'690\');"><img src="../images/edit.png" border="0"></a><img width="10" height="0"><a href="javascript:if(confirm(\'are_you_sure?\')) del_value(\'course_result\',\'164\',true);"><img src="../images/delete.png" border="0"></a></td>';
echo '<pre>';
print_r(htmlspecialchars($str));

$reg_exp = '/(?=<td)(?:.*)class="?(\w*)"?>([^<\/td>].*)(?!<\/td>)/';
preg_match_all($reg_exp, $str, $matches);
echo htmlspecialchars(print_r($matches, true));
Вот что у меня пока получилось.
PHP:
[0] => Array
        (
            [0] => <td class="notesContent1">Examen</td>
            [1] => <td class="notesContent2">&nbsp;</td>
            [2] => <td class="notesContent3">&nbsp;</td>
            [3] => <td class="notesContent4">&nbsp;</td>
            [4] => <td class="notesContent5">100</td>
            [5] => <td class="notesContent6">Exesa</td>
            [6] => <td class="notesContent7">sdasfasfdasdfadfdfasdf</td>
        )

    [1] => Array
        (
            [0] => notesContent1
            [1] => notesContent2
            [2] => notesContent3
            [3] => notesContent4
            [4] => notesContent5
            [5] => notesContent6
            [6] => notesContent7
        )

    [2] => Array
        (
            [0] => Examen</td>
            [1] => &nbsp;</td>
            [2] => &nbsp;</td>
            [3] => &nbsp;</td>
            [4] => 100</td>
            [5] => Exesa</td>
            [6] => sdasfasfdasdfadfdfasdf</td>
        )

)
Значит значение класса у меня получилось, кроме "notesContentEnd8". Если можно скажыте словами почему не находит.
Дальше начинаются проблемы.
Незнаю как задать условие для получения текста между td, точнее как записать условие "получить все данные кроме </td>"

PHP:
$reg_exp = '/(?=<td)(?:.*)class="?(\w*)"?>[COLOR=green]([^<\/td>].*)[/COLOR](?!<\/td>)/';
Просьба давать советы по конкретному вопросу и не писать все регуляное выражение. Хочу попытаться написать его сам за исключением моментов где буду обращаться за Вашей помощю.
P.S. По поводу хелпа читал статьи, кот. размещены на сайте про регулярки.
И еще, это не никак не касается кражы данных с чужего сайта.
Ах да если можно как то отпимизировать, записать по проще буду рад советам.
Спасибо.
 

Ярослав

Новичок
Автор оригинала: Гравицапа
Здорово, а что это тогда?
Отвечаю:
Значит при написании кода с использованием ajax было сделано следующую вещь:при обновлении данных в таблице данные возвращались ажаксом в виде сформированном тд со стилями и просто вставлялись в innerHTML тега tr. В ФФ все прекрасно работает, но в ИЕ как выяснилось позже свойство innerHTML для tr только realonly. Вот и нужно распарсить этот код а потом через javascript строить td для tr. атрибуты зарание известные так почему б их не распарсить. Если есть другой способ решения задачи буду рад услышать. Кстати регулярку надо на javascript писать, но думаю перенести проблем не составит. РНР как то ближе мне.
Надеюсь обьяснил и убедил?;)
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума
Если есть другой способ решения задачи буду рад услышат
Сделать чтоб AJAX возвращал данные нормально, а не обрабатывать через одно место.
 

Ярослав

Новичок
Автор оригинала: Mr_Max
Сделать чтоб AJAX возвращал данные нормально, а не обрабатывать через одно место.
Таких случаев много больше 10
в конечном счете может так и сделаю, я еще думаю над этим. Можно просто через JSON вернуть и потом в JS получить. Просто много изменять данных.
Но сейчас загорелся регулярным выражением - думаю пора усвоить этот этам так еще и повод появился.

-~{}~ 27.06.07 22:05:

Еще посидев намного не продвинулся
PHP:
$reg_exp = '/(?=<td)(?:.*)class="?(\w*)"?>(.*|[^<\/td])(?!<\/td>)/';
В таком варианте выводит еще notesContentEnd8
но как убрать </td> из
PHP:
 [0] => Examen</td>
            [1] => &nbsp;</td>
для меня загадка

-~{}~ 27.06.07 22:08:

только что обнаружил что
PHP:
$reg_exp = '/(?=<td)(?:.*)class="?(\w*)"?>(.*)(?!<\/td>)/';
работает так же как и предыдущий вариант
это меня вообще ставит в ступор

-~{}~ 27.06.07 22:56:

Ух!
Сделал вот что еще
PHP:
[2] => Array
        (
            [0] => Examen
            [1] => &nbsp;
            [2] => &nbsp;
            [3] => &nbsp;
            [4] => 100
            [5] => Exesa
            [6] => sdasfasfdasdfadfdfasdf
            [7] => <a href="javascript:load_value('course_result','164','690');"><img src="../images/edit.png" border="0"></a><img width="10" height="0"><a href="javascript:if(confirm('are_you_sure?')) del_value('course_result','164',true);"><img src="../images/delete.png" border="0"></a>
        )
вот регулярка
PHP:
$reg_exp = '/(?=<td)(?:.*)class="?(\w*)"?>(.*)<\/td>(?!<\/td>)/';
осталось только одно
атрибутами в теге td могут быть align и class и могут стоят один перед другим или наоборот
нужно достать еще align
есть идеи?

-~{}~ 27.06.07 23:10:

Это реально сделать?
 

Alexandre

PHPПенсионер
я вообще-то для построения таблиц с использованием аджакса использовал XSLT на клиенте, рекомендую.

З.Ы. это использовалось на ослике, так как было корпоративное решение, но думаю не возникнет проблем с использованием в опере или ФФ
например http://developer.mozilla.org/en/docs/The_XSLT/JavaScript_Interface_in_Gecko:Basic_Example
 

WP

^_^
Ярослав
Покури модификатор s и условные подмаски тебе не нужны.
> [^<\/td>]
Выдумщик.

'<td\s+(?:.*?\s+)?class="(.*?)".*?>(.*?)</td>~si'
 
Сверху