|
|
|
| Подскажите пожалуйста как распарсить:
<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',
)
),
)
|
| |
|
|
|
|
|
|
|
для: 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>";
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(31.05.2011 в 21:58)
| | О, спасибо большое.
Вот только одна проблемка
если после <p> идет <i> или <b>,
|
элемент не добавляется в массив.
Подскажите что необходимо дописать чтобы и на таких строках срабатывало? | |
|
|
|
|
|
|
|
для: DePro
(09.06.2011 в 13:31)
| | мое мнение: можно сделать так
<?
$pattern_txt = "|<p>.*(\d+\.\d+)\s.*<a[^>]+></a>([^<]+)<|is";
?>
|
| |
|
|
|
|
|
|
|
для: Ильдар
(09.06.2011 в 13:35)
| | что то не получается для такой строки:
<p>1.11 <a name="1"></a><i>Some text</i> DESCRIPTION DESCRIPTION DESCRIPTION</p>
|
| |
|
|
|
|
|
|
|
для: DePro
(09.06.2011 в 14:02)
| | ааа, ну для такой нужно другое. я видать не так понял условие.
<?
$pattern_txt = "|<p>.*(\d+\.\d+)\s.*<a[^>]+></a>.*([^<]+).*<|is";
?>
|
| |
|
|
|
|
|
|
|
для: Ильдар
(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
|
как подправить? | |
|
|
|
|
|
|
|
для: DePro
(09.06.2011 в 15:56)
| |
<?
$pattern_txt = "|<p>.*(\d+\.\d+)\s.*<a[^>]+></a>.*([^<]+).*<\/p>|is";
?>
|
| |
|
|
|
|
|
|
|
для: Ильдар
(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', ... ограничено | |
|
|
|