Консультация № 172046
10.09.2009, 12:13
0.00 руб.
0 3 1
Добрый день. Как функцией preg_match_all() выбрать из текста многострочный текст (извините за кашу). Выражение |<pre>(.*)</pre>|U не выбирает то что мне нужно. Пример текста в приложении из него надо достать "строка
еще строка
еще несколько строк"
Заранее спасибо за ответ.

Приложение:
различный многострочный html-текст...<pre>строка
еще строка
еще несколько строк</pre>

снова html-текст

Обсуждение

Неизвестный
10.09.2009, 12:20
общий
Думаю нужно использовать модификатор "s".
<?php
$msg = 'различный многострочный html-текст...<pre>строка
еще строка
еще несколько строк</pre>

снова html-текст';

preg_match_all('/<pre>(.*?)<\/pre>/s',$msg,$m);
?>
Неизвестный
10.09.2009, 12:46
общий
Миленин Александр:
спасибо за помощь
Неизвестный
11.09.2009, 09:29
общий
это ответ
Здравствуйте, Костин Александр Владимирович!
Нужно использовать префиксное и постфиксное "заглядывание". Для этого есть конструкции
(?<=regexp1)regexp2 - совпадет, только если перед совпадением с regexp2 будет совпадение с regexp1, regexp1 не попадает в буфер результата и не запоминается скбками.
regexp2(?=regexp1) - совпадет, только если после совпадения с regexp2 будет совпадение с regexp1, regexp1 не попадает в буфер результата и не запоминается скбками.
Я в данной ситуации сделал бы как-то так:

Приложение:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
$a=<<<aaa
различный многострочный html-текст...<pre>строка
еще строка
еще несколько строк</pre>

dfgdsfg
dfg
<pre>строка2
еще строка2
еще несколько строк2</pre>

<pre>fddlk dfkl</pre>
снова html-текст
aaa;
preg_match_all('/(?<=<pre>)[^<]*(?=<\/pre>)/',$a,$m);
print "<pre>";
foreach($m[0] as $i=>$e)
print $i."<pre>".htmlspecialchars($e)."</pre>";


?>
</body>
</html>
Форма ответа