Поиск и замена текстового содержимого тега

StackOverflow https://stackoverflow.com/questions/609390

  •  03-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь специально выделить / в тексте тега a.

1234/1234/ABCDE => 1234 / 1234 / ABCDE

В контексте;если у меня есть тег "а":

<a href="http://www.domain.com/path/to/page.html">12 34/1234A/BC DEFG</a>

Я хотел бы получить:

<a href="http://www.domain.com/path/to/page.html">12 34 / 1234A / BC DEFG</a>
Это было полезно?

Решение

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

(\s*/\s*(?=[^<>]+<))

Это всего лишь заменит '/' внутри тегов, а не URL-адресов.

В C#:

 myHtml = Regex.Replace(myHtml, @"(\s*/\s*(?=[^<>]+<))", " / ");

В Perl:

$myHtml =~ s!(\s*/\s*(?=[^<>]+<))! / !g;

В JavaScript:

myHtml = myHtml.replace(/(\s*\/\s*(?=[^<>]+<))/g, " / ");

Примечание:

в этих примерах весь документ должен быть загружен в myHtml струна.
Если вы работаете с одной строкой за раз, это, очевидно, не сработает, если внутри тегов есть новые строки или между парами тегов.

Другие советы

Это не совсем то, с чем хорошо справляются регулярные выражения. Возможно, вам будет лучше использовать анализатор HTML или XML - он создает дерево узлов вне документа, а затем вы можете просто пройтись по всем текстовым узлам, которые находятся внутри тегов, и добавить пробелы по мере необходимости.

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

Вот что-то в Perl, которое работает (но не использует регулярные выражения):

my (@a, $in_tag);
foreach(split //, $string) { # assuming $string holds our string
  $in_tag = 1 if 

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

Вот что-то в Perl, которое работает (но не использует регулярные выражения):

<*>

Это, однако, не регулярное выражение, а очень простой синтаксический анализатор.

eq "<"; $in_tag = 0 if

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

Вот что-то в Perl, которое работает (но не использует регулярные выражения):

<*>

Это, однако, не регулярное выражение, а очень простой синтаксический анализатор.

eq ">"; if(

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

Вот что-то в Perl, которое работает (но не использует регулярные выражения):

<*>

Это, однако, не регулярное выражение, а очень простой синтаксический анализатор.

eq "/" and not $in_tag) { push @a, " ", "/", " "; } else { push @a,

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

Вот что-то в Perl, которое работает (но не использует регулярные выражения):

<*>

Это, однако, не регулярное выражение, а очень простой синтаксический анализатор.

; } } $string = join "", @a;

Это, однако, не регулярное выражение, а очень простой синтаксический анализатор.

Я думаю, что нам не хватает контекста здесь. Это данные HTML, XML или просто фрагменты текста с тегами?

Если это HTML или XML, как часто упоминалось, регулярные выражения небезопасны, если вы точно не контролируете формат данных и не знаете, что всегда будете контролировать их. И вы это документируете.

Я бы использовал соответствующий парсер на вашем месте. Если у вас установлены Perl и XML :: Twig, подойдет следующая однострочная строка:

perl -MXML::Twig -e'XML::Twig->parse( keep_spaces => 1, "my_file.xml")->subs_text( "/", " / ")->print'

Если вы имеете дело с правильно сформированным XML без комментариев и разделов CDATA, то более эффективным способом будет использование PYX (вам нужно установить XML :: PYX):

pyx my_file.xml | perl -p -e's{/}{ / }g if m{-}' | pyxw

Какой язык? В Perl попробуйте s / \ // \ / / g .

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top