1

タグのテキストの / を具体的に埋めようとしています。

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*(?=[^<>]+<))

'/'URL ではなくタグ内のみを置き換えます。

C# の場合:

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

パールでは:

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

JavaScript の場合:

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

ノート:

これらの例では、ドキュメント全体をmyHtml文字列にロードする必要があります。
一度に 1 行で作業する場合、タグ内またはタグ ペアの間に改行があると明らかに機能しません。

于 2009-03-04T06:08:37.700 に答える
0

必要に応じて、正規表現を使用して 2 つのタグ間のテキストを抽出し、それを処理してから再挿入することもできますが、このタスクは、制約のために単一の正規表現よりもおそらく複雑です。

これは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 に答える
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 に答える