|
|
|
| Здравствуйте!
Есть строка, содержащая ХТМЛ код, например:
<?php
$html = "
<b>пример программы:</b>
<pre name=\"code\" class=\"php\">
if ($a > $b)
echo '1';
else
echo '2';
</pre>
";
?>
|
Эта все дело, выводится на экран, пропускаемое через функцию nl2br(), которая к переносам строк добавляет <br />
<?php
echo nl2br($html);
?>
|
Получается такое:
<b>пример программы:</b>
<br /><pre name="code" class="php">
<br /> if ($a > $b)
<br /> echo '1';
<br /> else
<br /> echo '2';
<br /></pre>
|
Но внутри тега <pre>, переносы строк не нужны, они и так показываются как надо. Как можно исправить такую проблему?
Я подумал регулярным выражением заменить все пары "\n<br />" на "\n" внутри тегов <pre>, но не знаю как правильно составить регулярное выражение.
<?php
$pattarn = 'ЗАМЕНИТЕ МНЕ, ПОЖАЛУЙСТА, \n<br /> на \n ВНУТРИ ТЕГОВ <pre> ';
$html = preg_replace($pattarn, ?, ?);
echo nl2br($html);
?>
|
Буду очень благодарен, если подскажете как выйти из такой ситуации. | |
|
|
|
|
|
|
|
для: temnovit
(14.10.2009 в 16:15)
| | думаю если удалять <br>, то это будет попростче
нужно только выражение типа <pre>.*?</pre> и простейшая callback-функция например
, а если пробовать заставить nl2br() заменять только где нужно
, то выражением придётся отловить и нужное и не нужное или пачками или по очереди
типа
function pre_skip($m) {
return (isset($m[1]))? $m[0]: nl2br($m[0]);
}
echo preg_replace_callback(
'#<pre.+?</pre(>)|(?:(?!<pre).[^<]*)+#s',
'pre_skip', $html);
| что будет быстрее нескажу | |
|
|
|
|
|
|
|
для: heed
(14.10.2009 в 18:05)
| | Спасибо, интересная идея.
Вот еще нажел такой вариант — функция на замену nl2br()
<?
function nl2brPre($input)
{
$input = preg_replace('%\n%i','<br/>',$input);
preg_match_all('%<pre\s*[^>]*>.+?</pre>%i',$input,$a);
for($i=0;$i<sizeof($a);$i++){
$input = str_replace($a[$i],str_replace("<br/>","\n",$a[$i]),$input);
}
return $input;
}
?>
|
У меня такая же проблема в другом приложении на Питоне, а там таких прелестей как preg_replace_callback() нет. Справиться просто рег, выражением невозможно?
У меня был вариант
pattern = re.compile(r'<pre(.*?)>(.*?)<br />(.*?)</pre>', re.S)
formatted = re.sub(pattern, r'<pre\1>\2\3</pre>', value);
|
Но он только первый <br /> убирает. | |
|
|
|
|
|
|
|
для: Temnovit
(14.10.2009 в 20:01)
| | python для меня как тёмный лес
смог только найти такие функции пока
#!C:\Pyton\python.exe
#<?Python v2.6.2
import re
txt = """
<b>пример:</b>
<pre name="code" class="php">
if ($a > $b)
echo '1';
else
echo '2';
</pre>
<b>пример программы:</b>
<pre name="code" class="php">
if ($a > $b)
echo '3';
else
echo '4';
</pre>
"""
print ("Content-Type: text/plain; charset=koi8-r")
print
p = re.compile(r'<pre[^>]*>(.*?)</pre>', re.S)
# print p
iterator = p.finditer(txt)
# print iterator
for match in iterator:
print match.span()
print match.group(0)
|
там есть RegexObject.findall что-то вроде preg_match_all()
, а насчёт того как использовать функцию в качестве строки замены что-то не смог найти
возможно даже придётся заменять ориентируясь на цифры начала совпадений , но возможно должен быть и другой способ | |
|
|
|
|
|
|
|
для: heed
(14.10.2009 в 21:00)
| | В итоге решил проблему вовсе без регулярных выражений — тупым перебором строк в цикле. Несколько неуклюже, но в моем случае работает как надо и, скорее всего, быстрее чем регулярное выражение.
Вот такой код:
def nl2brnopre(value):
#splitting string in lines
strings = value.split("\n");
#result will be stored here
result = '';
#are we inside <pre> tag?
inside_pre = False;
# for every line
for str in strings:
#this line is a start of <pre> tag?
this_line_has_pre = str.find('<pre') != -1;
#this line is a endt of <pre> tag (</pre>)?
this_line_has_endpre = str.find('</pre>') != -1;
#setting flag, until we find </pre>
if this_line_has_pre:
inside_pre = True;
#usetting flag, we found </pre>
if this_line_has_endpre:
inside_pre = False;
#depending on where we are
if not inside_pre:
result += str + "<br />\n";
else:
result += str + "\n";
return result;
|
heed, спасибо вам за помощь :) | |
|
|
|