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

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

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

 

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

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

тема: Разбор таблицы
 
 автор: P@Sol   (04.08.2008 в 13:25)   письмо автору
 
 

в очередной раз я не смог справиться с рег.выражениями и прошу вашей помощи

есть табличка:

<tr style='height: 20px;'>
<td class=row2r><b>1.
<td class=row2l style='padding-left: 2px;'><a class=mnu href='player.php?num=279480'>Егор Сабитов</a> <span><a href='nation.php?num=23911'><img border=0 src='pics/pl.gif' title='Игрок' width=14 height=14 style='position: relative; top: 2px;'></a></span>
<td class=row><img src="cntr/sb.gif" title="Сборная" width=20 height=14>
<td class=row2>AM
<td class=row2>18
<td class=row2>59
<td class=row2>3
<td class=row2>&nbsp;   
<td class=row2l><a target=_blank href='team.php?num=8276' class=mnu>"Динамо" Сакапа</a>
<td class=row2r nowrap style='padding-right: 1px;'><b>13 941</b>K
<tr bgcolor='#e0e0e0' style='height: 20px;'>
<td class=row2r><b>2.
<td class=row2l style='padding-left: 2px;'><a class=mnu href='player.php?num=279401'>Андрей Подольски</a> <span><a href='nation.php?num=23911'><img border=0 src='pics/pl.gif' title='Игрок' width=14 height=14 style='position: relative; top: 2px;'></a></span>
<td class=row><img src="cntr/sb.gif" title="Сборная" width=20 height=14>
<td class=row2>DM
<td class=row2>18
<td class=row2>55
<td class=row2>2
<td class=row2>&nbsp;Л2   
<td class=row2l><a target=_blank href='team.php?num=4703' class=mnu>"Подбешкиджи" Белград</a>
<td class=row2r nowrap style='padding-right: 1px;'><b>12 733</b>K
и т.д.

из нее надо достать
Егор Сабитов AM 18 59 3 &nbsp; "Динамо" Сакапа
Андрей Подольски DM18 55 2 &nbsp;Л2 "Подбешкиджи" Белград
и т.д.
для передачи данных в бд

  Ответить  
 
 автор: Николай2357   (04.08.2008 в 18:30)   письмо автору
 
   для: P@Sol   (04.08.2008 в 13:25)
 

Попробуй сначала просто strip_tags(), а если что останется, тогда думай.

  Ответить  
 
 автор: P@Sol   (04.08.2008 в 21:01)   письмо автору
 
   для: Николай2357   (04.08.2008 в 18:30)
 

кроме этой таблице на странице есть еще меню всякие...это конечно вариант...но все же

  Ответить  
 
 автор: Николай2357   (05.08.2008 в 04:53)   письмо автору
 
   для: P@Sol   (04.08.2008 в 21:01)
 

Чтобы составить паттерн, нужно знать, что убирать, что оставлять. А так получается - пойди туда не знаю куда. Если нужно выдернуть контент из HTML, то это то, что нужно. Только сначала нужно вырезать скрипты:
$cont=preg_replace("#<script[^>]*?>.*?</script>#si", "", $cont);

и стили:
$cont=preg_replace("#<style[^>]*?>.*?</style>#si", "", $cont);

Потом очистить от тегов:
$cont=strip_tags($cont);

и привести в удобоваримую форму:
 $cont=preg_replace("#[\r\n]+#", " ", $cont);
 $cont=preg_replace("#[\s]+#", " ", $cont);

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

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 09:26)   письмо автору
66.7 Кб
 
   для: Николай2357   (05.08.2008 в 04:53)
 

прикрепил эту страницу

  Ответить  
 
 автор: Николай2357   (05.08.2008 в 12:26)   письмо автору
 
   для: P@Sol   (05.08.2008 в 09:26)
 

А нужно конкретно ее распарсить или похожие другие есть? И в каком виде данные нужны, отдельно или в строчку?

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 12:53)   письмо автору
 
   для: Николай2357   (05.08.2008 в 12:26)
 

1. ее и похожие (меняется национальность) - в принцепе если распарсить ее, то с национальностями не должно быть проблем - вот эта строка меняется
<img src="plrz_show.php_files/id страны.gif" title="Название страны" height="14" width="20">


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

  Ответить  
 
 автор: Николай2357   (05.08.2008 в 16:34)   письмо автору
 
   для: P@Sol   (05.08.2008 в 12:53)
 

Проблемы с интернетом, заставил долго ждать. Если конкретно эту страницу, то просто от тегов ее не очистишь, она JS скриптом формируется. Можно вот так снаглеть:
<?
$cont
=$_POST['text'];
$cont=stripslashes($cont);
$mass=explode("<b>1.</b>",$cont);
$cont=$mass[1];
$mass=explode("<b>No.</b>",$cont);
$cont=$mass[0];
$cont=str_replace(">","> ",$cont);
$cont=strip_tags($cont);
$cont=preg_replace("#[\r\n]+#"""$cont);
$cont=preg_replace("#[\s]+#"" "$cont);
?>
<form action="test.php" method="post"><textarea name='text' cols="100" rows="30">
<?
echo $cont;
?>
</textarea><input type="submit"></form>
?>

а дальше дели по пробелам, считай и складывай в таблицу. Это случаем не тотализатор?

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 17:45)   письмо автору
 
   для: Николай2357   (05.08.2008 в 16:34)
 

>Проблемы с интернетом, заставил долго ждать. Если конкретно эту страницу, то просто от >тегов ее не очистишь, она JS скриптом формируется. Можно вот так снаглеть:
разве js формирует??? по-моему phpюююно ваш вариант красивый, забрал)) спасибо

>а дальше дели по пробелам, считай и складывай в таблицу. Это случаем не тотализатор?
по пробелам нельзя)) Там есть города из двух слов и т.п., но выход нашел)) поставил *, там где буду делить)))
не тотализатор, просто игра на тему футбола...а так я буду отслеживать рост игроков конкурентов

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 17:47)   письмо автору
 
   для: Николай2357   (05.08.2008 в 16:34)
 

>Проблемы с интернетом, заставил долго ждать. Если конкретно эту страницу, то просто от >тегов ее не очистишь, она JS скриптом формируется. Можно вот так снаглеть:
разве js формирует??? по-моему phpюююно ваш вариант красивый, забрал))

>а дальше дели по пробелам, считай и складывай в таблицу. Это случаем не тотализатор?
по пробелам нельзя)) Там есть города из двух слов и т.п., но выход нашел)) поставил *, там где буду делить)))
не тотализатор, просто игра на тему футбола...а так я буду отслеживать рост игроков конкурентов

  Ответить  
 
 автор: Николай2357   (05.08.2008 в 17:54)   письмо автору
 
   для: P@Sol   (05.08.2008 в 17:47)
 

Вот это вот: document.write('........ означает, что страница "выплевывается" скриптом.
Желаю удачи в игре.

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 17:58)   письмо автору
 
   для: Николай2357   (05.08.2008 в 17:54)
 

>Вот это вот: document.write('........ означает, что страница "выплевывается" скриптом.
хм...не вижу такой строки:( номер не подскажешь?
>Желаю удачи в игре.
большое спасибо, теперь буду бороться за медали)))

  Ответить  
 
 автор: Николай2357   (05.08.2008 в 18:04)   письмо автору
 
   для: P@Sol   (05.08.2008 в 17:58)
 

Ищущий, да обрящет...
Вот этот комментарий, и следующий скрипт.
<!--/COUNTER--><!--LiveInternet counter-->

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 22:53)   письмо автору
 
   для: Николай2357   (05.08.2008 в 18:04)
 

так это счетчики....)))

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 18:03)   письмо автору
 
   для: Николай2357   (05.08.2008 в 17:54)
 

удалил все строки <script>...</script> - страница отображается полностью

  Ответить  
 
 автор: Николай2357   (05.08.2008 в 18:06)   письмо автору
 
   для: P@Sol   (05.08.2008 в 18:03)
 

Она не вся скриптом, только меню помоему, сильно не вникал. Но это мешает от тегов чистить.

  Ответить  
 
 автор: P@Sol   (05.08.2008 в 22:54)   письмо автору
 
   для: Николай2357   (05.08.2008 в 18:06)
 

ну, вообщем заюзал я ваш скрипт, оч полезно и красиво, очень рад, спасибо

  Ответить  
 
 автор: fivemusic   (05.08.2008 в 23:26)   письмо автору
 
   для: Николай2357   (05.08.2008 в 18:06)
 

Помоему от тегов чистить не обязательно - так будет куда проще! Вот мой вариант решения :
(может вариант и корявый, но у меня сработало на ура =)

<pre>
<?
$content
=file_get_contents("a.htm"); // Страничка
$content=content_norm($content);

//$content = iconv("utf-8","cpwin-1251",$content); 
$content=utf8_win($content);
// Регулярка
preg_match_all("|player.php.*>.*([А-Яа-я][А-Яа-я\s]+)</a>.*>([0-9]+)</td><td.*>([0-9]+)</td><td.*>([0-9]+)</td><td.*>&nbsp;(.*)</td><td.*<a .*>([А-Яа-я\"\'][А-Яа-я\s\"\'\_\-]+)</a></td>.*</tr>|iSU",$content,$out);
unset(
$out[0]);
// Выводим
foreach($out[1] as $i=>$v) echo "$v ".$out[2][$i]." ".$out[3][$i]." ".$out[4][$i]." -> ".$out[5][$i]." <- ".$out[6][$i]." \n";
// В 1 строку
function content_norm($x)
{
 
$x=preg_replace("#[\r\n]+#"" "$x); 
 return 
preg_replace("#[\s]+#"" "$x);
}
// Из УТФ перегоняем в вин
function utf8_win ($s){ 
$out=""$c1=""
$byte2=false
for (
$c=0;$c<strlen($s);$c++){ 
$i=ord($s[$c]); 
if (
$i<=127$out.=$s[$c]; 
if (
$byte2){ 
$new_c2=($c1&3)*64+($i&63); $new_c1=($c1>>2)&5
$new_i=$new_c1*256+$new_c2
if (
$new_i==1025){ 
$out_i=168
}else{ 
if (
$new_i==1105){ 
$out_i=184
}else { 
$out_i=$new_i-848
}} 
$out.=chr($out_i); 
$byte2=false

if ((
$i>>5)==6) { 
$c1=$i
$byte2=true
}} 
return 
$out
}
?>

  Ответить  
 
 автор: Николай2357   (06.08.2008 в 00:41)   письмо автору
 
   для: fivemusic   (05.08.2008 в 23:26)
 

А чем проще? Если теги мешают спокойно жить, люди не зря ночей не спали, придумывая функцию strip_tags К томуже Ваш вариант не сработает, если фамилия будет Ёжиков. Или Renaldo.

  Ответить  
 
 автор: xx77   (06.08.2008 в 03:00)   письмо автору
 
   для: Николай2357   (06.08.2008 в 00:41)
 

<pre><?
$time 
microtime();
###########################################
$text file_get_contents('a.htm');
preg_match('|<tr bgcolor="#006600">(?:(?!<tr bgcolor="#006600">).[^<]*)+|s'$text$text);
// echo htmlspecialchars($text[0]);
$text preg_split('#(?:<[^>]+>\s*)+#'$text[0], -11);
#print_r($text);
$text array_chunk($text10);
print_r($text);
###########################################
echo '<hr>' . (microtime() -  $time) .'<hr>';
?></pre>


<pre><?
$time 
microtime();
###########################################
$text file_get_contents('a.htm');
preg_match('|<tr bgcolor="#006600">(?:(?!<tr bgcolor="#006600">).[^<]*)+|s'$text$text);
//
$text preg_split('#(?=<tr)#'$text[0], -11);
#print_r($text);
function s_t (&$val) {
$val strip_tags($val);
}
array_walk($text's_t');

print_r($text);
###########################################
echo '<hr>' . (microtime() -  $time) .'<hr>';
?></pre>


<pre><?
$time 
microtime();
###########################################
$text file_get_contents('a.htm');
preg_match('|<tr bgcolor="#006600">(?:(?!<tr bgcolor="#006600">).[^<]*)+|s'$text$text);
//
$text preg_split('#(?=<tr)#'$text[0], -11);
$text preg_replace('#(?:<[^>]+>)+#',  ' '$text);

print_r($text);
###########################################
echo '<hr>' . (microtime() -  $time) .'<hr>';
?></pre>

  Ответить  
 
 автор: xx77   (06.08.2008 в 03:16)   письмо автору
 
   для: xx77   (06.08.2008 в 03:00)
 

.) только время иногла с минусом показывает
переделывать нет времени

-0.986602

  Ответить  
 
 автор: P@Sol   (06.08.2008 в 09:59)   письмо автору
 
   для: xx77   (06.08.2008 в 03:00)
 

почему-то во всех случаях $text = file_get_contents('a.htm'); пусто вместо a.htm ставлю свой путь

  Ответить  
 
 автор: xx77   (06.08.2008 в 10:47)   письмо автору
 
   для: P@Sol   (06.08.2008 в 09:59)
 

<?
$text 
file_get_contents('a.htm'); 
echo 
htmlspecialchars($text) . '<hr>


<hr>'


preg_match('|<tr bgcolor="#006600">(?:(?!<tr bgcolor="#006600">).[^<]*)+|s'$text$text); 
echo 
htmlspecialchars($text[0]); 
?>


Если точно после file_get_contents()
а не после preg_match(),

то если файл находится на вашей машине , скорее всего он пуст ,) или неверно указан путь.
(во втором случае должно выводиться Warning)

или если файл получается по http-адресу {

попробуйте скачиваются-ли с других адресов функцией file_get_contents()

если да , то возможно вам вместо файла отдаётся какой-нибудь заголовок (типа переадресации например)

если нет , возможно что-то с диррективой allow_url_fopen , но тоже должно быть Warning
(если не выключен вывод ошибок)
}
вобщем трудно сказать что-то определённое .)

  Ответить  
 
 автор: Николай2357   (06.08.2008 в 11:08)   письмо автору
 
   для: xx77   (06.08.2008 в 10:47)
 

<?
$text 
file_get_contents('http://virtualsoccer.ru/plrz_show.php?nat_id=124&sort=4');

Все отлично видно, только кодировку смени, а то бракозябры.

  Ответить  
 
 автор: P@Sol   (06.08.2008 в 11:12)   письмо автору
 
   для: xx77   (06.08.2008 в 10:47)
 

точно))
1. на хостинге нас заставили отключить allow_url_fopen
2. а на локальной машине доступ в интернет через прокси

вот поэтому нигде я и не вижу страницу

счас пробую через fsockopen, но пока, что то не получается

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

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