PHP форматирование Regex - BBCode - PullRequest
1 голос
/ 25 мая 2010

Если честно, я так много отстой в regex, я бы использовал RegexBuddy, но я работаю на своем Mac, и иногда это не очень помогает (для меня).

Ну, для чегоМне нужно сделать, это функция в php

function replaceTags($n)
{
    $n = str_replace("[[", "<b>", $n);
    $n = str_replace("]]", "</b>", $n);
}

Хотя это плохой пример, если кто-то не закрыл тег с помощью]] или [[, в любом случае, не могли бы вы помочь с регулярным выражением:

[[]] = Полужирный формат

** ** = Курсив

(()) = h2 heading

Это все, что мне нужно, спасибо:)

PS - Есть ли какое-либо программное обеспечение, например RegexBuddy, для Mac (Snow Leopard)?

Ответы [ 3 ]

2 голосов
/ 25 мая 2010
function replaceTags($n)
{
    $n = preg_replace("/\[\[(.*?)\]\]/", "<strong>$1</strong>", $n);
    $n = preg_replace("/\*\*(.*?)\*\*/", "<em>$1</em>", $n);
    $n = preg_replace("/\(\((.*?)\)\)/", "<h2>$1</h2>", $n);
    return $n;
}

Мне, вероятно, следует дать небольшое объяснение: каждому специальному символу предшествует обратный слеш, поэтому он не обрабатывается как инструкции регулярного выражения ("[", "(" и т. Д.). "(. *?)" Захватывает все символы между разделителями ("[[" и "]]" и т. д.). Затем записывается вывод в строку замен вместо "$ 1".

1 голос
/ 25 мая 2010

Та же причина, по которой вы не можете сделать это с str_replace(), относится и к preg_replace(). Для парсинга стиля пары тегов требуется лексер / парсер, если вы хотите обеспечить 100% точность и скрыть ошибки ввода.

Регулярные выражения не могут обрабатывать незамкнутые теги, вложенные теги и тому подобное.

Несмотря на это, вы можете пройти 50% пути без особых усилий.

$test = "this is [[some]] test [[content for **you** to try, ((does [[it]])) **work?";

echo convertTags( $test );

// only handles validly formatted, non-nested input
function convertTags( $content )
{
  return preg_replace(
      array(
          "/\[\[(.*?)\]\]/"
        , "/\*\*(.*?)\*\*/"
        , "/\(\((.*?)\)\)/"
      )
    , array(
          "<strong>$1</strong>"
        , "<em>$1</em>"
        , "<h2>$1</h2>"
      )
    , $content
  );
}
0 голосов
/ 25 мая 2010

Модификаторы тоже могут помочь:)

http://lv.php.net/manual/en/reference.pcre.pattern.modifiers.php

U (PCRE_UNGREEDY) Этот модификатор инвертирует «жадность» квантификаторы, чтобы они не по умолчанию жадный, но становится жадным если после? Это не совместимо с перл. Это также может быть установлено (? U) настройка модификатора в пределах шаблон или знак вопроса за квантификатор (например, *?).

...