2013-06-28 5 views
3

Я работаю на минимальном языке разметки, и я пытаюсь разрешить пользователям курсивом текст с/slashes /. Однако я не могу получить регулярное выражение, которое работает правильно.Regex: Поиск пар не внутри определенных тегов

Ссылка на RegexPal: here.

Вот то, что я до сих пор и не совсем работа:

\/[^(\/|\<|\>)]*[^\/]*\/ 

Значение Я тестирование против:

I am attempting to replace values in /slashes/ with italic tags. The challenge: the mark up allows URLs to be placed into [http://www.google.com/s] square bracket tags, messing things up further. Now the tags are off balanced. What /do/ I do? I'd ideally like to have it skip searching [] tags? 

Любые идеи?

+1

Если вы хотите примириться с жизнью, выбрал другой Charac ter, который не всегда находится в тегах html. –

+1

проблема [решена] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – aaronman

+0

Возможно, вы правы. Но у меня такая же проблема с другими тегами разметки, как * и _. Я хотел бы попробовать и решить это, даже если я изменил характер позже. – Anthony

ответ

0

Вы можете попробовать это, идея состоит в том, чтобы сопоставлять html-теги или содержимое внутри скобок и самостоятельно их заменять.

var str = "I am attempting to replace values in /slashes/ with italic tags. One problem is HTML: If I do <b>html</b> <b>tags</b> tags, it picks up the closures. Also, the mark up allows URLs to be placed into [http://www.google.com/s] square bracket tags, messing things up further. Now the tags are off balanced. What /do/ I do? I'd ideally like to have it skip searching [] and inside <> tags. Doing <b>/italic/</b> should be legal, however."; 

str = str.replace(/<[^>]+>|\[[^\]]+\]|\/([^\/]*)\//g, function (m, p1) { 
    return (p1) ? '<i>' + p1 + '</i>' : m; }); 

console.log(str); 
+0

Это все еще захватывает косую черту в скобках [], но я думаю, что ваш подход правильный. Я должен сначала использовать регулярное выражение, чтобы отфильтровать, что должно быть вне пределов. Затем я могу выполнить поиск против этого более ограниченного текста. Как только я нахожу совпадения, я могу заменить его на исходную строку. – Anthony

+0

@ Энтони: для скобок вы должны сделать то же самое, см. Мое редактирование. –

+0

Это очень хорошо и решает вопрос, который я разместил, хотя мне все равно придется делать это по-другому, так как он разбивает вложенные теги, такие как */Bold и Italic/*. Мне, вероятно, придется использовать гораздо больше логики. Благодаря! – Anthony

0

Описание

Я думаю, что так, как я бы подойти к этому, чтобы соответствовать все плохое вместе со всем хорошо. Тогда в выражении только положите свое регулярное выражение. Позже в логике программирования я проверил каждое совпадение, чтобы увидеть, была ли заполнена группа захвата 1, если это так, то match.index покажет, где в строке, которая соответствует.

Это регулярное выражение будет:

  • матч обычный текст URLs, тем самым предотвращая их от захвата в группе 1
  • соответствует содержанию всех HTML тегов, тем самым предотвращая их от захвата в группе 1
  • будет соответствовать желаемой / текста в квадратных скобках, как /match me/ в группу захвата 1

https?:\/\/[^\s]*|<\/?\w+\b(?=\s|>)(?:='[^']*'|="[^"]*"|=[^'"][^\s>]*|[^>])*>|(\/[^(\/|\<|\>)]*[^\/]*\/)

enter image description here

Пример

Образец текста

I am attempting to replace values in /slashes/ with italic tags. One problem is HTML: If I do <b>html</b> <b>tags</b> tags, it picks up the closures. Also, the mark up allows URLs to be placed into [http://www.google.com/s] square bracket tags, messing things up further. Now the tags are off balanced. What /do/ I do? I'd ideally like to have it skip searching [] and inside <> tags. Doing <b>/italic/</b> should be legal, however. 

Матчи

[0] => Array 
    (
     [0] => /slashes/ 
     [1] => <b> 
     [2] => </b> 
     [3] => <b> 
     [4] => </b> 
     [5] => http://www.google.com/s] 
     [6] => /do/ 
     [7] => <b> 
     [8] => /italic/ 
     [9] => </b> 
    ) 

[1] => Array 
    (
     [0] => /slashes/ 
     [1] => 
     [2] => 
     [3] => 
     [4] => 
     [5] => 
     [6] => /do/ 
     [7] => 
     [8] => /italic/ 
     [9] => 
    ) 
+0

Это тоже имеет смысл - используйте логику для проверки ложных срабатываний. Походит на достойный способ сделать это! – Anthony

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