Помогите составить регулярку

1. Дмитрий (07.11.2010 / 10:30)
Вообщем стулкнулся с проблемой. Есть переменная текста, если она содержит более N символов - текст обрезается, так вот, если вконце строки будет бб-код например [u] тогда его обрезает все стает подчеркнутым E че можна сделать?

2. ComatoZZZ (11.11.2010 / 16:15)
заменять бб коды регулярными выражениями парами, хотя будет все равно некрасиво если в тексте будет [u] написано.
лучше всего обрезать строку раньше немного и проверять что не закрыто - то закрывать. Это можно без регулярки даже.

3. Дмитрий (13.11.2010 / 09:33)
лучше всего обрезать строку раньше немного
а как же я узнаю где у него в посте будет бб код?... это если попадется вконце, тогда все дальше идет выделенным.

4. Александр (13.11.2010 / 12:56)
посчитай открытые u и закрытые.

5. DmitryDick (13.11.2010 / 13:22)
<?php

# тут ты обрезал)

$open = substr_count($text, '[ u]');
$closed = substr_count($text, '[ /u]');

$to_closed = $open - $closed;

if ( $to_closed ) $text = $text.str_repeat('[/u]', $to_closed);

?>

как бэ вот

6. Дмитрий (13.11.2010 / 22:26)
Не, так не работает

Добавлено через 05:27 сек.
Во, работает, надо было <u> вместо [u] ) к этим функциям можна добавить <b>, <i> и прочие тэги чтобы по новой не писать?

7. DmitryDick (14.11.2010 / 17:30)
нет, придется по одному такому коду для каждого тега использовать. так что тут лучше регулярки =)

8. Дмитрий (14.11.2010 / 18:28)
ok)) E

9. Виталий (19.12.2010 / 15:22)
не хочю создавать тему так чо:
$msg = preg_replace('#\[blue\](.*?)\[/blue\]#si', '<span style="color:#0000ff">\1</span>', $msg);
мне нужно етое выражение зделать так чтоб вместо blue любое название подходило тоисть там где #0000ff любое название и там где то самое что там где колор

10. Марсель (19.12.2010 / 15:47)
preg_replace('#\[u\](.*)\[/u]#', '\1', $str);
выведет то, что между [u][/u]

Добавлено через 01:06 сек.
хех обрезалось) между скобками короче

11. Вантуз-мен (19.12.2010 / 18:42)
<?
function mb_substrws($text, $length = 180) { 
    if((mb_strlen($text) > $length)) { 
        $whitespaceposition = mb_strpos($text, ' ', $length) - 1; 
        if($whitespaceposition > 0) { 
            $chars = count_chars(mb_substr($text, 0, ($whitespaceposition + 1)), 1); 
            if ($chars[ord('<')] > $chars[ord('>')]) { 
                $whitespaceposition = mb_strpos($text, ">", $whitespaceposition) - 1; 
            } 
            $text = mb_substr($text, 0, ($whitespaceposition + 1)); 
        } 
        // close unclosed html tags 
        if(preg_match_all("|(<([\w]+)[^>]*>)|", $text, $aBuffer)) { 
            if(!empty($aBuffer[1])) { 
                preg_match_all("|</([a-zA-Z]+)>|", $text, $aBuffer2); 
                if(count($aBuffer[2]) != count($aBuffer2[1])) { 
                    $closing_tags = array_diff($aBuffer[2], $aBuffer2[1]); 
                    $closing_tags = array_reverse($closing_tags); 
                    foreach($closing_tags as $tag) { 
                            $text .= '</'.$tag.'>'; 
                    } 
                } 
            } 
        } 

    } 
    return $text; 
}


12. Игорь (30.12.2010 / 23:27)
Тоже не стал создавать отдельную тему.
Подскажите пожалуйста:
Нужно обрезать то что находится до и после <div class="***">***</div>
*** - некие данные

13. Марсель (08.01.2011 / 21:29)
preg_match_all('#(.*?)<div class="(.*?)">(.*?)</div>#si', $var, $result);
как то так E

URL: https://visavi.net/topics/15323