Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Парсировать таблицу
 
 автор: BMW   (15.02.2012 в 09:57)   письмо автору
 
 

ЗДравствуйте. Подскажите, где я ошибся? Задачи вытащить из таблицы данные, но что-то выводит таблицу в итоге а не ее элементы
preg_match('|<table class="wide">(.*)</table>|smi', $content, $arr);
$tb=$arr[1];
preg_match_all('|<tr>(.*)</tr>|smi', $tb, $ari);
preg_match_all('|<td>(.*)</td>|smi', $ari[0][0], $aru);
echo '<hr><br>';
print_r($ari);
echo $aru[0];

сама таблица вида
<table class="wide">
<tr>
<th valign="top">Индекс</th>
<th width="35%" valign="top">Название вещества</th>
<th width="35%" valign="top">Английское название<br />
<small>ссылка</small></th>
<th width="15%" valign="top">Цветок</th>
<th valign="top">Примечание</th>
</tr>
<tr>
<td>E100</td>
<td><i>Куркумины</i>:<br />
(i) <a href="%83%D0%BC%D0%B8%D0%BD" title="Куркумин">Куркумин</a><br />
(ii) <a href="%D0%A2%D1%83%D1%80%D0%BC%D0%B5%D1%80%D0%B8%D0%BA" title="Турмерик">Турмерик</a></td>
<td><i>Curcumins</i>:<br />
(i) <a href="//Curcumin" class="extiw" title="en:Curcumin">Curcumin</a><br />
(ii) <a href="//Turmeric" class="extiw" title="en:Turmeric">Turmeric</a></td>
<td>Жёлто-оранжевый</td>
<td>&#160;</td>
</tr>

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 15:54)   письмо автору
 
   для: BMW   (15.02.2012 в 09:57)
 

1. У меня ваш пример вообще ничего не выводит.
2. А что значит m в |smi ?
3. Вы используете "жадный" поиск (.*) а нужно (.*?)

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 16:04)   письмо автору
 
   для: BMW   (15.02.2012 в 09:57)
 

Вот так:
preg_match('|<table class="wide">(.*?)</table>|si', $table, $arr);
preg_match_all('|<td>(.*?)</td>|si', $arr[1], $aru);
print_r($aru);
выбираются все внутренности TD.
Если нужно по строкам, то нужно в цикле перебирать промежуточную выборку TR

  Ответить  
 
 автор: BMW   (15.02.2012 в 18:11)   письмо автору
 
   для: Sfinks   (15.02.2012 в 16:04)
 

спасибо! да отлично, а вот только как удалить все остальные тэги и можно ли выбирать без тегов обрамления <td>?
preg_match('|<table class="wide">(.*?)</table>|si', $content, $arr); 
preg_match_all('|<tr>(.*?)</tr>|si', $arr[1], $aru);
foreach($aru[1] as $s)
{
//print_r($s);
preg_match_all('|<td>(.*?)</td>|si', $s, $ar);
print_r($ar);
}

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 19:07)   письмо автору
 
   для: BMW   (15.02.2012 в 18:11)
 

> можно ли выбирать без тегов обрамления <td>
Так в массиве $ar[1] все элементы без тегов.

> а вот только как удалить все остальные тэги
$ar[1] = preg_replace("#</?[^>]+>#s","",$ar[1]);

  Ответить  
 
 автор: BMW   (15.02.2012 в 19:16)   письмо автору
 
   для: Sfinks   (15.02.2012 в 19:07)
 

точно, прошу прощения за вопросы, но еще один, а если в тэге td <td rowspan="3"> парсер их не выбирает это надо <td (*?)> прописать? а как число вычленить?

  Ответить  
 
 автор: Sfinks   (15.02.2012 в 19:20)   письмо автору
 
   для: BMW   (15.02.2012 в 19:16)
 

не <td (*?)>, а <td.*?> либо <td[^>]*>

  Ответить  
 
 автор: ladan   (16.02.2012 в 00:51)   письмо автору
 
   для: Sfinks   (15.02.2012 в 19:20)
 

а что за констукция
(.*?)
Либо 0, либо сколько угодно и знак вопроса- это 0 или 1...
Первый раз вижу, как она работает? :)

  Ответить  
 
 автор: Sfinks   (16.02.2012 в 03:14)   письмо автору
 
   для: ladan   (16.02.2012 в 00:51)
 

Это "не жадный" поиск. Если дана строка:

<teg>text</teg>text<teg>text</teg>text<teg>text</teg>

поиск по маске <teg>.*</teg> найдет <teg>text</teg>text<teg>text</teg>text<teg>text</teg>, т.е. до последнего совпадения (жадный)
а по маске <teg>.*?</teg> найдет <teg>text</teg>, т.е. до первого (не жадный)

  Ответить  
 
 автор: BMW   (16.02.2012 в 12:49)   письмо автору
 
   для: Sfinks   (16.02.2012 в 03:14)
 

спасибо, вот в итоге получилось как
$norm_td=5;
preg_match('|<table class="wide">(.*?)<td colspan="6"><b>&#160;Обозначения</b></td>|si', $content, $arr); 
preg_match_all('|<tr.*?>(.*?)</tr>|si', $arr[1], $aru);
foreach($aru[1] as $k => $s)
{
    //print_r($s);
    preg_match_all('|rowspan="(.*?)"|si', $s, $num);
    preg_match_all('|<td.*?>(.*?)</td>|si', $s, $ar);
    $ar[1] = preg_replace("#</?[^>]+>#s","",$ar[1]);

    foreach($ar[0] as $ki => $si)
        {

        if(($num[1][0]) and strstr($si,"rowspan="))
        {
    $key=$ki;
    $zamena=$ar[1][$key];
        }

        }
        if(count($ar[1])!=$norm_td)
        foreach($ar[1] as $ku => $su)
            {
            if($ku==$key){$ar[1][$key]=$zamena;$op=1;}
            if($op)$ar[1][$ku+1]=$su;
            }
        $op=0;
print_r($ar[1]);

}
все работает как надо)

  Ответить  
 
 автор: ladan   (17.02.2012 в 01:09)   письмо автору
 
   для: Sfinks   (16.02.2012 в 03:14)
 

спасибо, все понятно :)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования