Помогите составить регулярку
1.
Дмитрий (07.11.2010 / 10:30)
Вообщем стулкнулся с проблемой. Есть переменная текста, если она содержит более N символов - текст обрезается, так вот, если вконце строки будет бб-код например [u] тогда его обрезает все стает подчеркнутым
че можна сделать?
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))
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);
как то так
URL:
https://visavi.net/topics/15323