2017-06-24 9 views
0

次の正規表現:タグ付きRegexは動作しますが、特定のIDはありませんか?

(?!<script[^>]*>)[(.*?)](?![^<]*<\/script>) 

ターゲット毎[テキスト]と[INPUT]スクリプトタグ内の任意の[]を除いて、入力された文字列です。

代わりに、id="special"の特定のスクリプト上に例外があるようにこれを変更したいと思います。

したがって<script id="special">[INPUT]</script>は、<script>[INPUT]</script>のようなidが特別でない別のスクリプトタグは残りの文字列と一緒に指定する必要があります。

[^>]*>の前に上記の正規表現にid="special"を追加しようとしましたが動作しません。

+0

なぜ-1人ですか?私は改善したいと思いますが、なぜそれを知る必要がありますか? – Karem

+0

@ chris85ご意見ありがとうございます。フォーマットは一貫していますが、id = "special"のすべてのスクリプトタグと一致する必要があります。あなたの正規表現を試してみましたが、それは正規表現との一致を除いて[入力]との改行には一致しませんが( Karem

+0

となります。 – Karem

答えて

0

あなたはPCRE動詞skipfailを使用してそのIDでscript要素内のすべてをスキップすることができます。

<script id="special">.*?<\/script>(*SKIP)(*FAIL)|\[[^\]]+?\] 

デモ:https://regex101.com/r/PSMV15/5/

あなたはこのここで、http://www.rexegg.com/backtracking-control-verbs.html#skipfailについての詳細を読むことができます。

文字列がHTMLの場合、要素と属性にさまざまなバリエーションがある可能性があるため、パーサーを使用する必要があります。例えば

<script id="special"> 
<script src="page" id="special"> 
<script src="page" id="special" class="why?"> 
<script id='special'> 
<script id=special> 
<script id=special src=page> 

も層状要素の問題を入力せず。ここで正規表現とHTMLが一緒にならない理由についての1つのスレッドがあります。 RegEx match open tags except XHTML self-contained tags

+0

ありがとうございます!すばらしいです!最後に、$ 1は空です。これをどのように解決できますか?私は正規表現を変更しようとしました:

0

これでは複雑になるかもしれません。

あなたは空白のため、\ sのを使用することができ、属性を持っている<script>要素と一致しない場合:あなたは省略する必要がある唯一の属性が「ID」である場合は、

<\s*script\s*>\[(.*?)\]</\s*script\s*>

をでき<scriptと一致します

<script(?!.*\sid=).*>\[(.*?)\]</script>

が続いていない: 否定先読み/後読みを使います>文字の前の。より多くのヘルプをご覧ください このLink

+0

あなたの貢献に感謝します。私が達成したいと思っている2番目の解決策とは何の関係もありません:http://regexr.com/3g7qk – Karem

関連する問題