|
|
|
| Необходимо заменить конструкцию вида
Заменить на <H(1)></H(1)>, где число в скобках - соответственно, сколько раз встречается ~ в выражении.
При этом еще хотелось бы, чтобы если ~ встречается больше 6 (таких заголовков нет), то заменялось бы это все на <H6></H6> | |
|
|
|
|
|
|
|
для: Sturmvogel
(08.12.2011 в 16:37)
| | непонятно.
добавте приблизительный текст, и во что должен превратиться | |
|
|
|
|
|
|
|
для: duhon
(08.12.2011 в 18:24)
| | ну, например, есть
,
а должен превратиться в
Потому что стоит в исходном тексте 3 знака "=".
Таким образом
должен поменяться на
+ еще было бы круто, если бы конструкция типа
поменялась на
,
т.е. если знаков равно больше, чем 6 штук, превращать текст в <h6>Заголовок</h6> в любом случае.
Надеюсь, сейчас понятнее стало | |
|
|
|
|
|
|
|
для: Sturmvogel
(08.12.2011 в 18:27)
| |
<?php
$text = "=== aaaa\n====== bbb\n======= ccc";
$text = preg_replace_callback('/(=+)\s*(.*)/', function($match){
$num = strlen($match[1]);
if($num > 6){
$num = 6;
}
return '<h'.$num.'>'.$match[2].'</h'.$num.'>';
}, $text);
echo $text;
?>
|
| |
|
|
|
|
|
|
|
для: duhon
(08.12.2011 в 19:17)
| | Спасибо.
Но никак не обойтись без call-функции? Потому как у меня не одно такое правило замен есть и использую я 2 массива $from и $to, которые потом пропускаю через preg_replace($from, $to, $text).. | |
|
|
|
|
|
|
|
для: duhon
(08.12.2011 в 19:17)
| | И можно ли как-то подобное решение применить для, например, маркированных списков?
__* 1 уровень
____* 2 ур.
____* 2 ур.
__* 1 уровень
|
| |
|
|
|
|
|
|
|
для: Sturmvogel
(09.12.2011 в 13:40)
| | ответ не напишу но проще мысль такая
$from[] = '/(?<!=)=(.*)/';
$from[] = '/(?<!=)==(.*)/';
$from[] = '/(?<!=)===(.*)/';
$from[] = '/(?<!=)====(.*)/';
$from[] = '/(?<!=)={7,}(.*)/';
$to[] = '<h1>$1</h1>';
$to[] = '<h2>$1</h2>';
$to[] = '<h3>$1</h3>';
$to[] = '<h4>$1</h4>';
$to[] = '<h6>$1</h6>';
$text = preg_replace($from, $to, $text);
|
аналогично сделать и с маркированными списками, и так далее. | |
|
|
|
|
|
|
|
для: duhon
(09.12.2011 в 20:37)
| | Честно говоря, не понимаю, как можно маркированный список (не одного уровня) сделать такой конструкцией. | |
|
|
|
|
|
|
|
для: duhon
(09.12.2011 в 20:37)
| | Написал такой код для парсинга маркированных списков:
$prev_lvl = 1;
$Text = preg_replace_callback("/( +)\*(.*?)\n/", function($m){
global $prev_lvl;
$lvl = intval(strlen($m[1]) / 2);
$add= '';
if ($prev_lvl == '') $prev_lvl = 1;
if ($lvl > $prev_lvl)
{
$prev_lvl++;
$add = '<li><ul>';
}
elseif ($lvl < $prev_lvl)
{
$prev_lvl--;
$add = '</ul></li>';
}
$str = '<ul>'.$add.'<li>'.$m[2].'</li></ul>';
return $str;
}, $Text);
$Text = str_replace('</ul><ul>', '', $Text);
$Text = str_replace('</li><li><ul>', '<ul>', $Text);
|
но можно ли его как-то сделать проще и быстрее? | |
|
|
|