Поиск и замена текстового содержимого тега
Вопрос
Я пытаюсь специально выделить / в тексте тега 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
.