2つのタグの間のすべてのテキストを選択する最良の方法は何ですか-例:ページ上のすべての「pre」タグの間のテキスト。
/<div>.*?<\/div>/.exec("<div><div></div></div>")
2つのタグの間のすべてのテキストを選択する最良の方法は何ですか-例:ページ上のすべての「pre」タグの間のテキスト。
/<div>.*?<\/div>/.exec("<div><div></div></div>")
回答:
を使用"<pre>(.*?)</pre>"
して(preを任意のテキストに置き換えて)最初のグループを抽出できます(より具体的な手順については、言語を指定します)。これは、非常に単純で有効なHTMLがあるという単純な概念を前提としています。
他のコメンターが示唆しているように、複雑なことをしている場合は、HTMLパーサーを使用してください。
<pre>
、を試してもタグが引き続き表示される場合<pre>(.*?)<\/pre>
は、(。*?)キャプチャグループではなく、完全一致によってキャプチャされたものを表示しているためです。音が安っぽいが、私はいつも思うのでしない限り、「泥棒の括弧=ペア」(
が続いている?
のように(?:
、または(?>
、すべての試合には2つのキャプチャを持っています:キャプチャグループのための完全なマッチ&1のために1。括弧が追加されるたびに、キャプチャが追加されます。両方のキャプチャを、使用している言語で取得する方法を知っている必要があります。
タグは別の行で完了することができます。これが、\n
追加する必要がある理由です。
<PRE>(.|\n)*?<\/PRE>
(.|\n)*?
複数行にわたるHTMLタグを処理する場合の追加に関する重要なポイント。選択した回答は、HTMLタグが同じ行にある場合にのみ機能します。
(.|\n)*?
charとの一致に使用しないでください。常に(単一行)修飾子.
とともに使用しs
ます。または[\s\S]*?
回避策。
/\*(.|\n)*?\*/
して、仕事をしてくれた-ありがとう
(?<=(<pre>))(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|`~]| )+?(?=(</pre>))
基本的には次のようになります。
(?<=(<pre>))
選択には先頭に追加する必要があります <pre>
タグを
(\w|\d|\n|[().,\-:;@#$%^&*\[\]"'+–/\/®°⁰!?{}|~]| )
これは私が適用したい正規表現にすぎません。この場合、文字、数字、改行文字、または角括弧内の例にリストされているいくつかの特殊文字を選択します。パイプ文字は|
単に「OR」を意味します。
+?
プラス文字は、上記の1つ以上を選択することを示します-順序は関係ありません。疑問符は、デフォルトの動作を「貪欲」から「不欲」に変更します。
(?=(</pre>))
選択は</pre>
タグで追加する必要があります
ユースケースによっては、(iまたはm)などの修飾子を追加する必要がある場合があります
ここでは、Sublime Textでこの検索を実行したため、正規表現で修飾子を使用する必要はありませんでした。
上記の例は、PHP、Perl、Javaなどの言語で正常に動作するはず(?<=(<pre>))
です。おそらく、ここでのように、各選択の結果から最初の4文字を単純に
取り除き、タグ間の正規表現一致テキスト
キャプチャしない括弧については、JAVASCRIPT REGEX DOCUMENTATIONも参照してください。
以下のパターンを使用して、要素間のコンテンツを取得します。[tag]
コンテンツを抽出する実際の要素に置き換えます。
<[tag]>(.+?)</[tag]>
時々、タグはを持つタグのような属性anchor
を持ちhref
、以下のパターンを使用します。
<[tag][^>]*>(.+?)</[tag]>
<[tag]>
一致する<t>
、<a>
と<g>
Replace [tag] with the actual element you wish to extract the content from
パートを逃したと思います。
[]
はすべて省略されているはずです。RegExでの意味と実際には、人々が最初にコードをスキャンし、その後にテキストを読むことは、より明確になります;)
区切りタグを除外するには:
(?<=<pre>)(.*?)(?=</pre>)
(?<=<pre>)
後のテキストを探す <pre>
(?=</pre>)
前のテキストを探す </pre>
結果はpre
タグ内にテキストで送信されます
正規表現を使用してhtmlを解析しようとするべきではありません。この質問とその結果を確認してください。
簡単に言えば、htmlは通常の言語ではないため、正規表現では完全に解析できません。
ネストされた同様のタグがない場合は、htmlのサブセットを解析できると述べました。したがって、タグ自体の間になく、タグ自体でない限り、これは機能します。
preg_match("/<([\w]+)[^>]*>(.*?)<\/\1>/", $subject, $matches);
$matches = array ( [0] => full matched string [1] => tag name [2] => tag content )
より良いアイデアは、ネイティブDOMDocumentのようなパーサーを使用してhtmlをロードし、タグを選択して、次のような内部htmlを取得することです。
$obj = new DOMDocument();
$obj -> load($html);
$obj -> getElementByTagName('el');
$value = $obj -> nodeValue();
これは適切なパーサーなので、ネストタグなどを処理できます。
php
。PHPがどのように登場したのかわからない...
これを試して....
(?<=\<any_tag\>)(\s*.*\s*)(?=\<\/any_tag\>)
この回答は、見回すのサポートを前提としています!これにより、開始タグと終了タグのペアの間のすべてのテキストを識別できました。それが「>」と「<」の間のすべてのテキストです。見回すと、一致する文字が消費されないため、これは機能します。
(?<=>)([\ w \ s] +)(?= </)
このHTMLフラグメントを使用して、https://regex101.com/でテストしました。
<table>
<tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr>
<tr><td>Cell 4</td><td>Cell 5</td><td>Cell 6</td></tr>
</table>
これは、3つの部分からなるゲームです。後ろ向き、コンテンツ、そして先読みです。
(?<=>) # look behind (but don't consume/capture) for a '>'
([\w\s]+) # capture/consume any combination of alpha/numeric/whitespace
(?=<\/) # look ahead (but don't consume/capture) for a '</'
私はそれが10の始まりとして役立つことを願っています。
var str = "Lorem ipsum <pre>text 1</pre> Lorem ipsum <pre>text 2</pre>";
str.replace(/<pre>(.*?)<\/pre>/g, function(match, g1) { console.log(g1); });
受け入れられた回答にはJavaScriptコードがないため、以下を追加します。
Pythonでは、DOTALL
フラグを設定すると、改行を含むすべてがキャプチャされます。
DOTALLフラグが指定されている場合、これは改行を含むすべての文字に一致します。docs.python.org
#example.py using Python 3.7.4
import re
str="""Everything is awesome! <pre>Hello,
World!
</pre>
"""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
pattern = re.compile(r"<pre>(.*)</pre>",re.DOTALL)
matches = pattern.search(str)
print(matches.group(1))
python example.py
Hello,
World!
ドキュメント内のすべての開始タグと終了タグの間のテキストをキャプチャするにfinditer
は、便利です。以下の例では、3つの開始<pre>
タグと終了タグが文字列に含まれています。
#example2.py using Python 3.7.4
import re
# str contains three <pre>...</pre> tags
str = """In two different ex-
periments, the authors had subjects chat and solve the <pre>Desert Survival Problem</pre> with a
humorous or non-humorous computer. In both experiments the computer made pre-
programmed comments, but in study 1 subjects were led to believe they were interact-
ing with another person. In the <pre>humor conditions</pre> subjects received a number of funny
comments, for instance: “The mirror is probably too small to be used as a signaling
device to alert rescue teams to your location. Rank it lower. (On the other hand, it
offers <pre>endless opportunity for self-reflection</pre>)”."""
# Normally (.*) will not capture newlines, but here re.DOTATLL is set
# The question mark in (.*?) indicates non greedy matching.
pattern = re.compile(r"<pre>(.*?)</pre>",re.DOTALL)
matches = pattern.finditer(str)
for i,match in enumerate(matches):
print(f"tag {i}: ",match.group(1))
python example2.py
tag 0: Desert Survival Problem
tag 1: humor conditions
tag 2: endless opportunity for self-reflection
使用できます Pattern pattern = Pattern.compile( "[^<'tagname'/>]" );
<pre>([\r\n\s]*(?!<\w+.*[\/]*>).*[\r\n\s]*|\s*[\r\n\s]*)<code\s+(?:class="(\w+|\w+\s*.+)")>(((?!<\/code>)[\s\S])*)<\/code>[\r\n\s]*((?!<\w+.*[\/]*>).*|\s*)[\r\n\s]*<\/pre>