3

2 つの HTML マークアップ タグの間の /> を削除する正規表現を作成するのに助けが必要です。

<!-- The line could look like this -->
<td align=right valign=bottom nowrap><div>January 24, 2013 /></div></td>

<!-- Or this -->
<div>Is this system supported? /></div>

<!-- Even this -->
<span>This is a span tag /></div>

<!-- It could look like any of these but I do not want /> removed -->
<img src="example.com/example.jpg"/></img>
<img src="example.com/example.jpg"/>
<img src="example.com/example.jpg"/></img>
<div id="example"><img src="example.com/example.jpg"/></div>

(はい、img タグには関連付けられた終了タグがないことに気付きました。作成していない無数のページを動的に編集しています。これは私のマークアップではありません。)

これが私が思いついた正規表現です(perlを使用):

s|(<.*?>(?!<img).*?)(\s*/>)(?!</img>)(</.*?>)|$1$3|gi;

より効率的または高速な正規表現はありますか?

上記の例に正規表現を適用すると、結果は次のようになります。

<!-- The line could look like this -->
<td align=right valign=bottom nowrap><div>January 24, 2013></div></td>

<!-- Or this -->
<div>Is this system supported?></div>

<!-- Even this -->
<span>This is a span tag></div>

<!-- It could look like any of these but I do not want /> removed -->
<img src="example.com/example.jpg"/></img>
<img src="example.com/example.jpg"/>
<img src="example.com/example.jpg"/></img>
<div id="example"><img src="example.com/example.jpg"/></div>
4

1 に答える 1

2

より短い解決策は次のとおりです。

s/(<[^>]*>[^<]*)\/>/$1/g

開始タグと、次の可能性のあるコンテンツをグループ化します。ただし、別のタグを示す開始角かっこは除きます。次に、 を探します/>。見つかった場合は、置換を使用して削除します。

更新:の前にある可能性のある空白を削除するように質問が拡張されました/>[^<]*これは、次のように部分を「怠惰」にすることで実行できます。

s/(<[^>]*>[^<]*?)\s*\/>/$1/g

regex101で自分の目で確かめてください(リンクが更新されました)。

于 2013-03-06T16:11:52.623 に答える