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

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

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

 

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

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

тема: Strlen в preg_replace
 
 автор: Sturmvogel   (08.12.2011 в 16:37)   письмо автору
 
 

Необходимо заменить конструкцию вида
/([~]{1,6})/iu


Заменить на <H(1)></H(1)>, где число в скобках - соответственно, сколько раз встречается ~ в выражении.

При этом еще хотелось бы, чтобы если ~ встречается больше 6 (таких заголовков нет), то заменялось бы это все на <H6></H6>

  Ответить  
 
 автор: duhon   (08.12.2011 в 18:24)   письмо автору
 
   для: Sturmvogel   (08.12.2011 в 16:37)
 

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

  Ответить  
 
 автор: Sturmvogel   (08.12.2011 в 18:27)   письмо автору
 
   для: duhon   (08.12.2011 в 18:24)
 

ну, например, есть
=== Заголовок
,
а должен превратиться в
<h3>Заголовок</h3>

Потому что стоит в исходном тексте 3 знака "=".

Таким образом
==== Заголовок

должен поменяться на
<h4>Заголовок</h4>


+ еще было бы круто, если бы конструкция типа
============= Заголовок

поменялась на
<h6>Заголовок</h6>
,
т.е. если знаков равно больше, чем 6 штук, превращать текст в <h6>Заголовок</h6> в любом случае.

Надеюсь, сейчас понятнее стало

  Ответить  
 
 автор: duhon   (08.12.2011 в 19:17)   письмо автору
 
   для: 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;
?>

  Ответить  
 
 автор: Sturmvogel   (08.12.2011 в 19:27)   письмо автору
 
   для: duhon   (08.12.2011 в 19:17)
 

Спасибо.
Но никак не обойтись без call-функции? Потому как у меня не одно такое правило замен есть и использую я 2 массива $from и $to, которые потом пропускаю через preg_replace($from, $to, $text)..

  Ответить  
 
 автор: Sturmvogel   (09.12.2011 в 13:40)   письмо автору
 
   для: duhon   (08.12.2011 в 19:17)
 

И можно ли как-то подобное решение применить для, например, маркированных списков?

__* 1 уровень
____* 2 ур.
____* 2 ур.
__* 1 уровень

  Ответить  
 
 автор: duhon   (09.12.2011 в 20:37)   письмо автору
 
   для: 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);

аналогично сделать и с маркированными списками, и так далее.

  Ответить  
 
 автор: Sturmvogel   (10.12.2011 в 00:31)   письмо автору
 
   для: duhon   (09.12.2011 в 20:37)
 

Честно говоря, не понимаю, как можно маркированный список (не одного уровня) сделать такой конструкцией.

  Ответить  
 
 автор: Sturmvogel   (10.12.2011 в 15:41)   письмо автору
 
   для: 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);


но можно ли его как-то сделать проще и быстрее?

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

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