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

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

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

 

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

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

тема: Убрать все теги <br />, что внутри тегов <pre></pre>
 
 автор: temnovit   (14.10.2009 в 16:15)   письмо автору
 
 

Здравствуйте!

Есть строка, содержащая ХТМЛ код, например:

<?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);
?>


Буду очень благодарен, если подскажете как выйти из такой ситуации.

  Ответить  
 
 автор: heed   (14.10.2009 в 18:05)   письмо автору
 
   для: 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);
что будет быстрее нескажу

  Ответить  
 
 автор: Temnovit   (14.10.2009 в 20:01)   письмо автору
 
   для: 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 /> убирает.

  Ответить  
 
 автор: heed   (14.10.2009 в 21:00)   письмо автору
 
   для: 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
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()
, а насчёт того как использовать функцию в качестве строки замены что-то не смог найти
возможно даже придётся заменять ориентируясь на цифры начала совпадений , но возможно должен быть и другой способ

  Ответить  
 
 автор: Temnovit   (15.10.2009 в 17:23)   письмо автору
 
   для: 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, спасибо вам за помощь :)

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

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