-5

doctype と char-set を取得する必要があるプロジェクトに取り組んでいます。

実は、私は別の方法でそれを取得しています。しかし、正規表現で doctype と char-set を取得するのは非常に困難です。これは、html でさまざまな方法で伝えることができるからです。

だから誰でもこれを手に入れるのを手伝ってくれる?

からの後のすべてのテキストと<!DOCTYPEから<!DOCTYPE HTML or more can be here>char-set値を取得する必要があります<meta charset="UTF-8"/>

PHP preg_match関数で使いたい。その場合、誰かが私を助けてくれれば、それは私にとって非常に役に立ちます。

4

1 に答える 1

2

このようなものを考えると:

<!DOCTYPE HTML or more can be here>

次の内容を取得するに<!DOCTYPEは、正規表現検索文字列を次のようにする(pattern)必要があります。

<!DOCTYPE[ ]+([^ ][^>]+[^ />]+)[ /]*>

(最初の) 後方参照 ( \1) は、後続のすべての値を保持しますが、末尾の " " ( )、" " ( )、または " " ( )<!DOCTYPEは含みません。 spaces/slashes>right-angle-brackets

したがって、これについて:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN">

これを返します:

HTML PUBLIC "-//W3C//DTD HTML Strict//EN"



charsetはもう少し難しいです。次の 2 つの形式のいずれかになります。

  1. 短い:
    <meta charset='utf-8'>
  2. 長いです:
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>

の値を取得するにcharsetは、正規表現検索文字列を次のようにする必要があります。

<meta[ ]+([^>]*|)(charset=['" ]*([^'"> ][^'">]+[^'"> ])['" ]*|charset=[ ]*([^'"> ][^'">]+[^'"> ]))([^>]*|)>

3 番目の後方参照 ( \3) には の値が保持され、先頭または末尾( )、[ ] ( )、または " " ( )charsetは含まれません。
" "spaces'"quote-marks>right-angle-brackets

したがって、次のような場合 (適切でないものもありますが、遭遇する可能性があります):

<meta charset=utf-8>
<meta charset='utf-8'>
<meta charset="utf-8">
<meta charset='utf-8 '>
<meta charset=" utf-8">
<meta charset=" utf-8 ">

<meta charset=utf-8>
<meta charset='utf-8' something='value'>
<meta something='value' charset="utf-8">
<meta something='value' charset='utf-8 ' somethingelse='value'>

<meta http-equiv='Content-Type' content=text/html; charset=utf-8>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
<meta http-equiv='Content-Type' content="text/html; charset=utf-8">
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' >
<meta http-equiv='Content-Type' content='text/html; charset=utf-8 ' >
<meta http-equiv='Content-Type' content='text/html; charset= utf-8' >
<meta http-equiv='Content-Type' content='text/html; charset= utf-8 ' >

<meta http-equiv='Content-Type' content=text/html; charset=utf-8>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8' something='value'>
<meta http-equiv='Content-Type' something='value' content="text/html; charset=utf-8">
<meta something='value' http-equiv='Content-Type' content='text/html; charset=utf-8' >
<meta http-equiv='Content-Type' something='value' content='text/html; charset=utf-8 ' something='value' >

それは戻ります:

utf-8




注:上記の文字列は、 DOCTYPEpatternに一致するように修正されています( (アスタリスク) が不適切でした)。"*"



編集:

(patterns)関数を使用して上記 の正規表現検索文字列を使用する方法PHP: preg_match...

の構文preg_match( function.preg-matchから):

preg_match($pattern, $subject, $matches)

pattern : 検索するパターン (文字列)。
subject : 入力文字列。
一致:一致が提供された場合、検索結果が入力されます。$matches[0]には完全なパターンに一致したテキストが含まれ、 $matches[1]には最初にキャプチャされた括弧で囲まれたサブパターンに一致したテキストが含まれます。

patternで囲む必要があるためdelimiterspreg_match文字列のRegex-pattern-stringどの部分が で、どの部分が であるかがわかります<pattern-modifiers>( delimiters についてはこちらを参照してください)。(注:subjectは必要ありませんdelimiters)。

pattern文字列は次 のように構成されます。

<opening-delimiter>Regex-pattern-string<closing-delimiter> <pattern-modifiers>

通常、 には を使用します"/"が、 のdelimitersほとんどの形式brackets、または (ほとんどの) 任意のpunctuation(英数字以外) を使用できます。

この場合、文字列"/"内でa を使用しpatternているため、この例では、"#"簡単にするために区切り文字として a を使用します。

この例では、pattern-modifierofも使用しiます。これは、またはcase内の文字を考慮せずに検索を実行することを指定します。* * が文字列内の通常の文字として扱われる ことを指定するために、追加の ofを含めることもできます。これは、文字列内のテキストが複数行にまたがる場合に便利です。patternsubjectpattern-modifiermnewline("\n")subjectsubject

したがって、最初のケースでは、PHPコードは次のようになります。

$pattern="#<!DOCTYPE[ ]+([^ ][^>]+[^ />]+)[ /]*>#i";
$subject="<!DOCTYPE HTML or more can be here>";
$result=preg_match($pattern, $subject, $matches)
/* if $result===1, then a match was found */
/* and the captured text can be found in $matches[1] */


2 番目のケースの文字列の指定は、 (一重引用符) と(二重 引用符) のpattern両方が含まれているため、もう少し複雑です。(')(")

は引用符を他の文字と同様に扱うpatternため、引用符は実際には文字列内では問題になりません。preg_matchここでの引用符の問題は、pattern.

したがって、文字列を定義するには、 (一重引用符) または(二重 引用符)escapeのいずれかを使用する必要があります。(')(")

次の 3 つの選択肢があります。

  1. 文字列を(二重引用符) でpattern囲んで定義し、文字列内の各(二重引用符) の前に(バックスラッシュ) を付けて定義します。(")escape(")(\)
  2. 文字列を(一重引用符) でpattern囲んで定義し、文字列内の各(一重引用符) の前に(バックスラッシュ) を付けて定義します。(')escape(')(\)
  3. pattern文字列を (二重引用符) で囲んで定義し、次の表現を使用して文字列内の(")各 (二重引用符) を指定します。(")HEX\x22

したがって、pattern次の 3 つの方法のいずれかで文字列を定義できます。

$pattern='#<meta[ ]+([^>]*|)(charset=[\'" ]*([^\'"> ][^\'">]+[^\'"> ])[\'" ]*|charset=[ ]*([^\'"> ][^\'">]+[^\'"> ]))([^>]*|)>#i';
$pattern="#<meta[ ]+([^>]*|)(charset=['\" ]*([^'\"> ][^'\">]+[^'\"> ])['\" ]*|charset=[ ]*([^'\"> ][^'\">]+[^'\"> ]))([^>]*|)>#i";
$pattern="#<meta[ ]+([^>]*|)(charset=['\x22 ]*([^'\x22> ][^'\x22>]+[^'\x22> ])['\x22 ]*|charset=[ ]*([^'\x22> ][^'\x22>]+[^'\x22> ]))([^>]*|)>#i";

2 番目のケースでは、PHPコードは次のようになります。

$pattern='#<meta[ ]+([^>]*|)(charset=[\'" ]*([^\'"> ][^\'">]+[^\'"> ])[\'" ]*|charset=[ ]*([^\'"> ][^\'">]+[^\'"> ]))([^>]*|)>#i';
$subject="<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>";
$result=preg_match($pattern, $subject, $matches)
/* if $result===1, then a match was found */
/* and the captured text can be found in $matches[3] */
于 2013-04-26T20:55:58.193 に答える