Поиск и замена текстового содержимого тега - PullRequest
1 голос
/ 04 марта 2009

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

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>

Ответы [ 5 ]

3 голосов
/ 04 марта 2009

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

2 голосов
/ 04 марта 2009

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

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

Он будет заменять '/' только внутри тегов, а не URL-адресов.

В C #:

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

В Perl:

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

В JavaScript:

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

Примечание:

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

0 голосов
/ 04 марта 2009

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

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

my (@a, $in_tag);
foreach(split //, $string) { # assuming $string holds our string
  $in_tag = 1 if $_ eq "<";
  $in_tag = 0 if $_ eq ">";
  if($_ eq "/" and not $in_tag) {
    push @a, " ", "/", " ";
  }
  else {
    push @a, $_;
  }
}
$string = join "", @a;

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

0 голосов
/ 04 марта 2009

Я думаю, нам здесь не хватает контекста. Это данные 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
0 голосов
/ 04 марта 2009

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

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