このようなものを考えると:
<!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 つの形式のいずれかになります。
- 短い:
<meta charset='utf-8'>
- 長いです:
<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
で囲む必要があるためdelimiters
、preg_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-modifier
ofも使用しi
ます。これは、またはcase
内の文字を考慮せずに検索を実行することを指定します。* * が文字列内の通常の文字として扱われる
ことを指定するために、追加の ofを含めることもできます。これは、文字列内のテキストが複数行にまたがる場合に便利です。pattern
subject
pattern-modifier
m
newline
("\n")
subject
subject
したがって、最初のケースでは、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 つの選択肢があります。
- 文字列を(二重引用符) で
pattern
囲んで定義し、文字列内の各(二重引用符) の前に(バックスラッシュ) を付けて定義します。(")
escape
(")
(\)
- 文字列を(一重引用符) で
pattern
囲んで定義し、文字列内の各(一重引用符) の前に(バックスラッシュ) を付けて定義します。(')
escape
(')
(\)
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] */