powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] Регулярка
9 сообщений из 34, страница 2 из 2
[PHP] Регулярка
    #38080446
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, напишите рабочий вариант.
...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38080447
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно посмотреть
...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38080814
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stopkranконкретно для первого примера ([13617842]) можно использовать такую схему...
Вариант, заточенный под определенный текст, это конечно хорошо, но думаю решение должно быть более универсальным, чтобы не переписывать код после каждого изменения во входящих данных. След. код можно (и нужно) оптимизировать, но невалидный html-код он кушает и с поставленной задачей справляется.
код
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
<?php

$html_body = <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title></title>
</head>

<body>
<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<div class="hidden">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</div>

<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</div>

</body>
</html>
HTML;

function find_tag_pos($str, $tag, $offset)
{
  if ($str == "")
	return false;

  if ($tag == "" || !preg_match("/^<\/[\w]+>$/i",$tag))
	return false;

  if (($offset >= strlen($str)) || ($offset<0))
	return false;

  $open_tags = 0;
  $length = strlen($tag);
  $p1 = $offset;

  while (($p1 = strpos($str,"<",$p1)) !== false)
  {
	if (($open_tags == 0) && (substr($str,$p1,$length) == $tag))
	  return $p1;

	if (substr($str,$p1,2) == "</")
	  $open_tags--;
	else
	  $open_tags++;

	$p1++;
  }

  return $p1;  // false
}

function __strip_tags($str, $tags)
{
  if ($str == "")
	return $str;

  if (!is_array($tags))
	return $str;

  $html = $str;

  foreach($tags as $tag)
  {
	if (!preg_match("/^<([\w]+)/i",$tag,$m))
	  continue;

	$tag2 = "</{$m[1]}>";
	$length = strlen($tag);
	$p1 = $p2 = $p3 = 0;
	while (($p1 = strpos($html,$tag,$p1)) !== false)
	{
	  if (($p2 = find_tag_pos($html,$tag2,$p1+$length)) === false)
		return $str;  // return $html; ?

	  $p1 += $length+1;
	  $html = substr($html,0,$p1) . strip_tags(substr($html,$p1,$p2-$p1)) . substr($html,$p2,strlen($html)-$p2);
	  $p1 = $p2;
	}
  }
  return $html;
}

echo __strip_tags($html_body, array('<p class="text">','<div class="content">'));

/*
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title></title>
</head>

<body>
<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vestibulum tempor leo auctor placerat. Ut vel ipsum enim. Nam ac neque enim. Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam. Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<div class="hidden">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</div>

<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vestibulum tempor leo auctor placerat. Ut vel ipsum enim. Nam ac neque enim. Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam. Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<div class="content">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vestibulum tempor leo auctor placerat. Ut vel ipsum enim. Nam ac neque enim. Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam. Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</div>

</body>
</html>
*/
?>

...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38080981
Vaytl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VaroЕсть страничка
+

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title></title>
</head>

<body>
<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>
</body>

</html>



нужно вырезать все теги между
Код: html
1.
<p class="text"></p>



Т.е. должно получится так
+

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title></title>
</head>

<body>
<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vestibulum tempor leo auctor placerat. Ut vel ipsum enim. Nam ac neque enim. Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam. Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vestibulum tempor leo auctor placerat. Ut vel ipsum enim. Nam ac neque enim. Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam. Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>
</body>

</html>



Помогите пожалуйста с регулярным выражением

Сделал на базе preg_replace_callback

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
$text = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title></title>
</head>

<body>
<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>
</body>

</html>';

function tags($matches) {
	return '<p class="text">'.strip_tags($matches[0]).'</p>';
}

echo preg_replace_callback('#<p class="text">.*?\n</p>#s', 'tags', $text);

...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38081063
stopkran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hett,
ну, вот, например, вариант с тупым explode: http://ir2.ru/explode.php

В этом варианте одно допущение - предполагается, что на странице нет ничего, кроме существенных элементов (<p class="text">...</p>).

phpz,
слишком много букв.

Vaytl,
это норм. вариант, можно сказать, классика. Но в нём тоже есть допущение: \n (всё держится на обязательном переносе строки перед существенным закрывающем тэгом </p>).

Решить, какое из допущений надёжнее, может только хозяин проблемы. Можно придумать, наверное, и другие варианты, зная точно, какие ограничения налагаются на исходный вакуум.
...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38081113
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stopkran,

Как же без букафф-то, чтоб код не править
...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38081764
Varo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VaytlСделал на базе preg_replace_callback
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
$text = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>
  <title></title>
</head>

<body>
<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>

<p class="text">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. <p>Cras vestibulum tempor leo auctor placerat.</p> <p>Ut vel ipsum enim.</p> Nam ac neque enim. <b>Pellentesque enim diam, fermentum commodo aliquet in, venenatis non quam.</b> Praesent dictum accumsan nulla, ac rutrum ipsum pharetra eu. Donec aliquam, risus a volutpat rutrum, nunc purus mattis leo, eget feugiat odio elit non diam.
</p>
</body>

</html>';

function tags($matches) {
	return '<p class="text">'.strip_tags($matches[0]).'</p>';
}

echo preg_replace_callback('#<p class="text">.*?\n</p>#s', 'tags', $text);

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

stopkran...Хм ) Работает, но только для данного примера, в реальности это страница с кучей тегов и текста, так что используя ваш вариант - туда попадет мусор, ну а так - работает :)

phpz...В "Боевом" режиме отработал неправильно, почему, разбираться не стал, логика слишком накручена
...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38082388
stopkran
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Varo,

если подходить "универсально", задача кажется неразрешимой. Теоретически должен бы сработать DOM, но, если будут какие попало (закрытые-незакрытые) тэги <p>, мы никаким способом не сможем точно выделить элемент именно с классом "text".

Я бы всё-таки копал в сторону "меток": что окружает нужные фрагменты текста? В конце это м.б. какой-нибудь счётчик, в начале - меню или ещё что-то устойчиво повторяющееся на каждой странице. Ну, или на группе страниц. Я именно так когда-то скачивал и парсил Малый Академический Словарь русского языка, терпеливо, по одной букве... Ну, а как вы хотите - за всё надо платить (хотя бы своим трудом и временем)! :-)
...
Рейтинг: 0 / 0
[PHP] Регулярка
    #38082664
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Varophpz...В "Боевом" режиме отработал неправильно, почему, разбираться не стал, логика слишком накручена
Можно посмотреть на кусочек "боевого", просто после эшелона кода даже самому интересно стало.
...
Рейтинг: 0 / 0
9 сообщений из 34, страница 2 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / [PHP] Регулярка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]