PHP Заменяет, Но Альтернативная Строка Замены


Хорошо, вот что я пытаюсь сделать: я пытаюсь использовать PHP для разработки того, что по сути является крошечным подмножеством реализации markdown, не стоит использовать полный класс markdown.

По сути, мне нужно выполнить str_replace, но чередовать строку замены для каждого вхождения иглы, чтобы обрабатывать открывающие и закрывающие HTML-теги.

Например, курсив - это пара звездочек, таких как *это*, а блоки кода окружены обратными знаками, такими как `это`.

Мне нужно заменить первое вхождение пары символов соответствующим открывающим тегом HTML, а второе - закрывающим тегом.

Есть идеи, как это сделать? Я полагал, что будет задействовано какое-то регулярное выражение...

Author: redwall_hp, 2009-07-02

2 answers

Лично я бы перебирал каждое вхождение * или \ с помощью счетчика и заменял символ соответствующим тегом HTML на основе количества (например, если количество четное и вы нажмете звездочку, замените его на <em>, если оно нечетное, замените его на </em> и т. Д.).

Но если вы уверены, что вам нужно поддерживать только пару простых видов разметки, то регулярное выражение для каждого из них может быть самым простым решением. Что-то вроде этого для звездочек, для пример (непроверенный):

preg_replace('/\*([^*]+)\*/', '<em>\\1</em>', $text);

И что-то подобное для обратных косых черт.

 4
Author: Sasha Chedygov, 2009-07-02 04:37:47

То, что вы ищете, чаще всего обрабатывается государственной машиной или лексером/синтаксическим анализатором.

Это некрасиво, но это работает. Уловка: только для одного типа шаблона за раз.

$input = "Here's some \\italic\\ text and even \\some more\\ wheee";

$output = preg_replace_callback( "/\\\/", 'replacer', $input );

echo $output;

function replacer( $matches )
{
    static $toggle = 0;
    if ( $toggle )
    {
        $toggle = 0;
        return "</em>";
    }
    $toggle = 1;
    return "<em>";
}
 3
Author: Peter Bailey, 2009-07-02 05:43:47