Как я могу удалить некоторые символы из внутренних угловых скобок, оставив символы снаружи? - PullRequest
1 голос
/ 12 мая 2010

Редактировать: Для ясности, пожалуйста, поймите, что я не использую Regex для разбора HTML, это сумасшедший разговор! Я просто хочу очистить грязную строку html, чтобы она анализировалась

Редактировать # 2: Я должен также указать, что используемый мной управляющий символ - это специальный символ Юникода - это не то, что когда-либо использовалось бы в правильном теге при любых нормальных обстоятельствах

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

Например

Здесь управляющим символом является цифра «1».

Input

The quick 1<strong>orange</strong> lemming <sp11a1n 1class1='jumpe111r'11>jumps over</span> 1the idle 1frog

Желаемый выход

The quick 1<strong>orange</strong> lemming <span class='jumper'>jumps over</span> 1the idle 1frog

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

Мое регулярное выражение

Имейте в виду, что это соответствует только тегам, которые содержат управляющий символ.

<(([^>])*?`([^>])*?)*?>

Большое спасибо за ваше время и внимание.

Иэн Фрейзер

Ответы [ 3 ]

2 голосов
/ 12 мая 2010

Regex не является инструментом для этого, но вы можете использовать lookbehind и lookahead для сопоставления 1 в теге. Здесь это в Java, модифицированной, чтобы иметь конечный вид сзади (поскольку Java не поддерживает бесконечный вид сзади).

    String s = "123 <o123o></o1o1> <oo 11='11x'> x11 <msg136='I <3 Johnny!11'>";
    System.out.println(
        s.replaceAll("(?<=<[^<>]{0,999})(?=[^<>]+>)1", "")
    ); // prints "123 <o23o></oo> <oo ='x'> x11 <msg136='I <3 Johnny!'>

Есть много случаев, когда это не удастся, но это должно вас где-то начать.

Смотри также


Хорошо, я "обобщил" проблему, чтобы она не имела отношения к HTML. Вот фрагмент Java, который использует регулярное выражение для удаления [aeiou] из частей предложения, заключенных в < и >, использование которых зарезервировано только для пометки этих специальных частей.

ВНИМАНИЕ: это регулярное выражение абсолютно нечитаемо. Но да, это работает. И он тоже не использует взгляд назад.

String s = "Wait <whaaat?> does this <really really> work???";
System.out.println(
    s.replaceAll("(?!>)(?:(?=<)|(?=\\G)(?!^))(?:(?:(?![aeiou])(.))|.)", "$1")
); // prints "Wait <wht?> does this <rlly rlly> work???"

Я мог бы попытаться объяснить это, если есть интерес, но в противном случае я бы предложил вместо этого использовать простой цикл, подобный этому:

allocate output buffer
set isInside := false
for every character ch in input
   if (ch is openChar)
      isInside := true
   else if (ch is closeChar)
      isInside := false
   else if not (isInside and ch is control)
      append ch to buffer
1 голос
/ 12 мая 2010

Обычно вы не должны использовать регулярные выражения для анализа html - но это не html для начала, и, следовательно, вы не можете использовать анализатор. Кажется, работает следующее.

var s = "The quick 1<strong>orange</strong> lemming <sp11a1n 1class1='jumpe111r'11>jumps over</span> 1the idle 1frog";
while(s.match(/<[^>]*?1(?=[^>]*>)/))
  s = s.replace(/(<[^>]*?)1(?=[^>]*>)/g, "$1");
console.log(s); //"The quick 1<strong>orange</strong> lemming <span class='jumper'>jumps over</span> 1the idle 1frog"
0 голосов
/ 12 мая 2010

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

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

Затем вы можете проанализировать полученный xml / html с помощью анализатора документов xml / html. Затем вы можете выполнить это, чтобы выполнить поиск и заменить теги, имена атрибутов, значения.

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