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

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

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

 

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

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

тема: Распарсить в массив
 
 автор: DePro   (31.05.2011 в 21:23)   письмо автору
 
 

Подскажите пожалуйста как распарсить:

<div align="justify" id="block" class="txt">
CONTENT CONTENT CONTENT TAGS TAGS TAGS TAGS
<p>1.1 <a name="1"></a>Text_1 Text_1 Text_1 Text_1 Text_1 Text_1 Text_1<a href="link1.php">Link 1</a>. <a href="link2.php">Link 2</a>. <a href="link3.php">Link 3</a>. <a href="link4.php">Link 4</a>. <a href="link5.php">Link 5</a>.</p>
<p>1.2 <a name="2"></a>Text_2 Text_2 Text_2 Text_2 Text_2 Text_2 Text_2</p>
<p>1.3 <a name="3"></a>Text_3 Text_3 Text_3 Text_3 Text_3 Text_3 Text_3. <a href="link9.php">Link 9</a>.</p>
<p>1.4 <a name="4"></a>Text_4 Text_4 Text_4 Text_4 Text_4 Text_4 Text_4.</p>
<p>1.5 <a name="5"></a>Text_5 Text_5 Text_5 Text_5 Text_5 Text_5 Text_5.</p>
TAGS TAGS TAGS TAGS CONTENT CONTENT CONTENT
</div>

чтобы получить массив

array(
    [1.1]=>array(
        "text"=>"Text_1 Text_1 Text_1 Text_1 Text_1 Text_1 Text_1",
        "link"=>array(
            1=>'Link 1',
            2=>'Link 2',
            3=>'Link 3',
            4=>'Link 4',
            5=>'Link 5',
        )
    ),
    
    [1.2]=>array(
        "text"=>"Text_2 Text_2 Text_2 Text_2 Text_2 Text_2 Text_2",
        "link"=>array()
    ),
    
    [1.3]=>array(
        "text"=>"Text_3 Text_3 Text_3 Text_3 Text_3 Text_3 Text_3.",
        "link"=>array(
            1=>'Link 9',
        )
    ),
)

  Ответить  
 
 автор: cheops   (31.05.2011 в 21:58)   письмо автору
 
   для: DePro   (31.05.2011 в 21:23)
 

Можно начать отталкиваться от следующего скрипта
<?php
  $text 
'<div align="justify" id="block" class="txt"> 
CONTENT CONTENT CONTENT TAGS TAGS TAGS TAGS 
...
</div>'
;
  
$pattern "|<p>\d+\.\d+.*?</p>|is";
  
preg_match_all($pattern$text$out);
  
$result = array();
  
$pattern_txt "|<p>(\d+\.\d+)\s*<a[^>]+></a>([^<]+)<|is";
  
$pattern_lnk "|<a\s+href[^>]+?>(.+?)</a>|is";
  for(
$i 0$i count($out[0]); $i++)
  {
    
preg_match_all($pattern_txt$out[0][$i], $res);
    
$result[$res[1][0]]['text'] = $res[2][0];
    
preg_match_all($pattern_lnk$out[0][$i], $lnk);
    for(
$j 0$j count($lnk[1]); $j++)
    {
      
$result[$res[1][0]]['link'][] = $lnk[1][$j];
    }
  }
  echo 
"<pre>";
  
print_r($result);
  echo 
"</pre>";
?>

  Ответить  
 
 автор: DePro   (09.06.2011 в 13:31)   письмо автору
 
   для: cheops   (31.05.2011 в 21:58)
 

О, спасибо большое.
Вот только одна проблемка
если после <p> идет <i> или <b>, 

элемент не добавляется в массив.
Подскажите что необходимо дописать чтобы и на таких строках срабатывало?

  Ответить  
 
 автор: Ильдар   (09.06.2011 в 13:35)   письмо автору
 
   для: DePro   (09.06.2011 в 13:31)
 

мое мнение: можно сделать так

<?
$pattern_txt 
"|<p>.*(\d+\.\d+)\s.*<a[^>]+></a>([^<]+)<|is";
?>

  Ответить  
 
 автор: DePro   (09.06.2011 в 14:02)   письмо автору
 
   для: Ильдар   (09.06.2011 в 13:35)
 

что то не получается для такой строки:
<p>1.11 <a name="1"></a><i>Some text</i> DESCRIPTION DESCRIPTION DESCRIPTION</p>

  Ответить  
 
 автор: Ильдар   (09.06.2011 в 14:11)   письмо автору
 
   для: DePro   (09.06.2011 в 14:02)
 

ааа, ну для такой нужно другое. я видать не так понял условие.

<? 
$pattern_txt 
"|<p>.*(\d+\.\d+)\s.*<a[^>]+></a>.*([^<]+).*<|is"
?>

  Ответить  
 
 автор: DePro   (09.06.2011 в 15:56)   письмо автору
 
   для: Ильдар   (09.06.2011 в 14:11)
 

только сейчас заметил что если в тексте встречается html теги типа i, b - то текст считывается только до этих тегов, т.е. текст такой
<p>1.11 <a name="1"></a>DESCRIPTION_1 DESCRIPTION_2 <i>Some text</i>  DESCRIPTION_3</p>

будет выведено только
DESCRIPTION_1 DESCRIPTION_2

как подправить?

  Ответить  
 
 автор: Ильдар   (09.06.2011 в 16:50)   письмо автору
 
   для: DePro   (09.06.2011 в 15:56)
 

<?  
$pattern_txt 
"|<p>.*(\d+\.\d+)\s.*<a[^>]+></a>.*([^<]+).*<\/p>|is";  
?>

  Ответить  
 
 автор: DePro   (09.06.2011 в 17:03)   письмо автору
 
   для: Ильдар   (09.06.2011 в 16:50)
 

все равно не подходит.
выдает только "." точку

  Ответить  
 
 автор: .....   (17.06.2011 в 00:17)
 
   для: DePro   (09.06.2011 в 17:03)
 

Собс-но примерный алгоритм Вам показали (извлечение параграфов с последующим извлечением подстрок из них), а что может или не может попадаться в обрабатываемом Вами тексте, виднее Вам. там более не видно что нужно а что не нужно записать в массив

Кроме предложенных 2х preg_match_all() в php на такое есть ещё например preg_replace_callback()
, внутри функции в массив пишется всё , и <a>...</a> и то что не
<?php
header
('content-type: text/plain'); 

$text '<div align="justify" id="block" class="txt"> 
..........................
</div>'


 
$out = array();
 
 function 
psh($m) {
    global 
$out;
    
preg_match_all(
    
'#\G\s*(?:
    (?:(?!<a\b).[^<]*)+
    |
    <a\b.+?</a>
    )\s*#xis'
$m[2], $tmp);
    
$out[$m[1]] = $tmp[0];
    return 
'';
 }
 
 
 
preg_replace_callback('#<p[^>]*>\s*(\d+\.?\d*)(.*?)</p>#is''psh'$text);

  
print_r($out);
?>

  Ответить  
 
 автор: .....   (17.06.2011 в 00:30)
 
   для: DePro   (09.06.2011 в 17:03)
 

теоретически есть возможность получить массив, типа
array( 
    [1.1]=>array( 
        "text"=>"Text_1 Text_1 Text_1 Text_1 Text_1 Text_1 Text_1", 
        "link"=>array( 
            1=>'Link 1', 
            2=>'Link 2', 
            3=>'Link 3', 
            4=>'Link 4', 
            5=>'Link 5', 
        ) 
    ), 
     
    [1.2]=>array( 
        "text"=>"Text_2 Text_2 Text_2 Text_2 Text_2 Text_2 Text_2", 
        "link"=>array()

одним выражением типа (цифры)(текст)(линк1)(линк2)?(линк3)?......
, если колличество 1=>'Link 1', 2=>'Link 2', ... ограничено

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

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