2015-02-06 3 views
1

Я знаю, что это будет ОЧЕНЬ очевидный ответ, но я не могу найти ничего о том, как это сделать.Рекурсивный шаблон регулярного выражения в JavaScript

Я пытаюсь < и экранирования в > внутри HTML строки

Моя строка вывода тест по существу:

```php 
&gt;h2&lt;Heading2&gt;/h2&lt; 
``` 

`&gt;h2&lt;Heading2&gt;/h2&lt;` 

&gt;h2&lt;Heading2&gt;/h2&lt; 

Таким образом, в этом примере мы имеем Github приправленный Markdown, регулярный code уценки сниппет , а затем необработанный текст с тем же тегом HTML. Я хочу отменить необработанный тег (третий), чтобы фактически стать ссылкой. Идеальный выход будет примерно таким.

```php 
&gt;h2&lt;Heading2&gt;/h2&lt; 
``` 

`&gt;h2&lt;Heading2&gt;/h2&lt;` 

<h2>Heading2</h2> 

Я застрять на получение мультипликатор &gt; в одной и той же линии.

Текущее регулярное выражение:

/(?:.*?(&gt;))/ 

Это позволит получить первую запись.

/(?:.*?(&gt;))/g 

Этот номер получает вторую запись. Я хочу, чтобы он мог получить КАЖДЫЙ вход. Тогда, это просто вопрос бросания клещей.

/(?:```|`)(?:.*?(&gt;)).*?(?:```|`)/gs 
+0

Я могу только заменить '' >, которые являются НЕ в '\' \ '\' {здесь} \ '\' \ '' и '\' {здесь} \ '' –

ответ

2

Если вы планируете на использование регулярного выражения для решения этой задачи, вы можете рассмотреть следующие вопросы:

var r = s.replace(/((`(?:``)?)[^`]*\2)|&gt;/g, '$1<') 
     .replace(/((`(?:``)?)[^`]*\2)|&lt;/g, '$1>') 
     .replace(/`[<>]+/g, '`'); 

Working Demo

+0

Спасибо hwnd! Могу ли я спросить, почему нужна вторая замена? Я вижу проблему, но мне интересно, можем ли мы заставить ее не добавлять <после конечного тика. –

+0

В любом случае, это решит это, я думаю, и просто запустите секунду с '<' заменено на '$ 1>' –

+1

@EricHolmes Я отредактировал ответ с общим решением. – hwnd

Смежные вопросы