Как я могу заменить {code} или {noformat} Wikitext тегами <code> - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь взять подробности / комментарии по делу Jira и использовать детали в нашей системе поддержки / обслуживания и хочу заменить теги {code} и {noformat} на <code> теги, так что форматирование похоже на то, что показано в Jira

Я попробовал несколько выражений регулярных выражений, но безуспешно.

Вот что я пробовал до сих пор

/({code}(?:(?!{code}).)*){code}((?:(?!{code}).)*)/ для замены всех других тегов {code} на и /{code}/, чтобы затем заменить оставшиеся теги {code} на <code>

Это также не учитывает вероятность того, что тег {code} может иметь теги {noformat} внутри, и их не следует заменять или наоборот.

Вот тот же код, с которым я работаю

$jira = new JiraClient\JiraClient('https://jira.url', 'myUser', 'myPass');
try {

    $issue = $jira->issue()->get($ticketJira);

    //$caseBody = $issue->getDescription()

    //For testing Let's Hardset the caseBody

    $caseBody = 'Example Code: {code}{ "fields": { "project": { "key": "JIRA" }, "summary": "Build Jira API into Support Interface to help raise cases.", "description": "Creating of an issue using project\\r\\nkeys and issue type names using the REST API\\r\\n{code}Markup Test{code}", "issuetype": { "name": "Production Task/Issue" }, "customfield_10800": [{"value":"Not applicable"}], "fixVersions": [{"name":"3.0.136.2"},], "versions": [{"name":"3.0.136.2"},] } }{code}';

    // Replace {code} / noformat tags here
      $descRaw = $issue->getDescription();
      $despPre = preg_replace('/({code}+)/', '<code>', $descRaw,1);
      $desc = preg_replace('/(.*(?:(?!{code}).)*){code}((?:(?!.*).)*)/', '\\1</code>\\2', $despPre);


    echo('<label class="control-label">'.$issue->getKey().' - '.$issue->getSummary().'</label>');
    echo("<p class='modal-content' style='text-align: left !important;'>".nl2br($desc)."</p>");
    echo('');
}
catch (\JiraClient\Exception\JiraException $e) {
    echo('<p>'.$e.'></p>');
}

У меня 2 проблемы: встроенные теги также преобразуются, и я бы хотел, чтобы это работало с тегами {noformat} вместо того, чтобы делать второй проход.

1 Ответ

0 голосов
/ 24 апреля 2019

Этот должен делать то, что вы хотите: {code}(.*?){code}. Связанный с preg_replace(), он заменит все {code} вхождения на <code> (или , если найден предыдущий).

Пример, который также заменяет {noformat} на <code>:

$str = '{code}var a = 1;{code} then, {noformat}a = 5;{noformat} and, {code}a -= 4;{code}';

$codePatterns = [
    '/{code}(.*?){code}/',
    '/{noformat}(.*?){noformat}/'
];

// output: <code>var a = 1;</code> then, <code>a = 5;</code> and, <code>a -= 4;</code>
echo preg_replace($codePatterns, '<code>$1</code>', $str);

Проверьте этот фрагмент на 3v4l.org


Объяснение регулярного выражения:

  • {code} соответствует буквально {code}
  • (.*?) ...
    • () захватывает содержимое между для последующего использования
    • . соответствует любому символу, кроме новой строки
    • *? соответствует от нуля до неограниченного числа раз предыдущего символа, как можно меньше раз
  • {code} соответствует буквально {code}

Примечание: Если бы я использовал .* вместо .*?, результат был бы:

<code>var a = 1;{code} then, <code>a = 5;</code> and, {code}a -= 4;</code>

Наверное, поэтому вы закончили с таким сложным выражением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...