1

我正在尝试专门在 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>
4

5 回答 5

3

这并不是正则表达式擅长的事情。使用 HTML 或 XML 解析器可能会更好——它会从文档中创建一个节点树,然后您可以逐步遍历标签内的所有文本节点并根据需要添加空格。

于 2009-03-04T06:06:18.890 回答
2

这个正则表达式应该可以解决问题:

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

它只会替换'/'inside 标签而不是 URL。

在 C# 中:

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

在 Perl 中:

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

在 JavaScript 中:

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

笔记:

在这些示例中,必须将整个文档加载到myHtml字符串中。
如果您一次只处理一行,那么如果标签内或标签对之间有换行符,它显然不起作用。

于 2009-03-04T06:08:37.700 回答
0

什么语言?在 Perl 中,尝试s/\// \/ /g.

于 2009-03-04T06:04:12.157 回答
0

我认为我们在这里缺乏一些背景。数据是 HTML、XML 还是只是带有标签的文本片段?

如果它是 HTML 或 XML,正如经常提到的那样,正则表达式是不安全的,除非您准确控制数据的格式,并且您知道您将始终控制它。然后你记录下来。

如果我是你,我会使用合适的解析器。如果你安装了 Perl 和 XML::Twig,下面的单行代码就可以了:

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

如果您正在处理没有注释和 CDATA 部分的格式良好的 XML,那么更有效的方法是使用 PYX(您需要安装 XML::PYX):

pyx my_file.xml | perl -p -e's{/}{ / }g if m{-}' | pyxw
于 2009-03-04T06:20:33.583 回答
0

如果需要,您可以尝试使用正则表达式提取两个标签之间的文本,然后对其进行处理,然后重新插入它,但由于您的限制,此任务可能比单个正则表达式更复杂。

这是 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;

然而,这不是一个正则表达式,而是一个非常简单的解析器。

于 2009-03-04T06:28:21.600 回答