我正在开发一个需要获取doctype和char-set的项目。
事实是我通过另一种方式得到它。但是通过正则表达式获取doctype和char-set是如此困难,因为这可以通过html以各种方式告知。
所以有人可以帮我解决这个问题。
我需要从<!DOCTYPE
<!DOCTYPE HTML or more can be here>
和char-set
<meta charset="UTF-8"/>
之后得到所有文字。
我想在PHP
preg_match
函数中使用它。所以,如果有人帮助我,那对我来说非常有用。
答案 0 :(得分:2)
考虑到这样的事情:
<!DOCTYPE HTML or more can be here>
要捕获 <!DOCTYPE
后面的内容,正则表达式搜索字符串 (pattern)
应为:
<!DOCTYPE[ ]+([^ ][^>]+[^ />]+)[ /]*>
(第一个)反向引用( \1
)将保留 <!DOCTYPE
之后的所有内容的值,但不会包含任何尾随&#34;的 强>&#34; (
spaces
),&#34; /
&#34; ( slashes
),或&#34; >
&#34; (的 right-angle-brackets
强>)。
所以,为此:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML Strict//EN">
它会返回:
HTML PUBLIC "-//W3C//DTD HTML Strict//EN"
charset
稍微困难一些。它可以是以下两种形式之一:
<meta charset='utf-8'>
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
要捕获 charset
的值,正则表达式搜索字符串应为:
<meta[ ]+([^>]*|)(charset=['" ]*([^'"> ][^'">]+[^'"> ])['" ]*|charset=[ ]*([^'"> ][^'">]+[^'"> ]))([^>]*|)>
第三个反向引用( \3
)将保留 charset
的值,并且不会包含任何前导或尾随
/>
" "
( spaces
)或[ '"
]( {{1} } ),或&#34; quote-marks
&#34; (的 >
强>)。
所以,对于任何这样的(有些不合适但可能会遇到):
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
字符串已经更正,以便匹配 DOCTYPE (一个< strong> pattern
(星号)不合适。)
如何使用 "*"
函数使用上面的正则表达式搜索字符串 (patterns)
: PHP
...
preg_match
的语法(来自function.preg-match):
preg_match
模式 :要搜索的模式,为字符串。
主题 :输入字符串。
匹配 :如果提供 匹配 ,则会填充搜索结果。 $ matches [0] 将包含与完整模式匹配的文字, $ matches [1] 将包含与第一个捕获的带括号的子模式匹配的文本,依此类推。
preg_match($pattern, $subject, $matches)
必须包含在 pattern
中,因此 delimiters
可以告知哪个部分字符串是 preg_match
,哪一部分是 Regex-pattern-string
(see this about delimiters)。 (注意: <pattern-modifiers>
不需要 subject
。
delimiters
字符串的组成如下:
pattern
<opening-delimiter>
Regex-pattern-string
<强><closing-delimiter>
强> 的
通常情况下,您会对 <pattern-modifiers>
使用 "/"
,但您可以使用大多数 {{1} } ,或(大多数)任何 delimiters
(非字母数字)。
在这种情况下,您在 brackets
字符串中使用 punctuation
,因此对于此示例,我们将使用 "/"
作为分隔符,使其更容易。
对于此示例,我们还将使用 pattern
"#"
。这指定将执行搜索,而不考虑 pattern-modifier
或 {{1}中字符的 i
} 即可。您还可以添加 case
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] */
(双引号)。
引号标记实际上不是 pattern
字符串中的问题,因为 (')
会像任何其他字符一样处理引号。引号标记的问题在于编写定义包含 (")
的字符串的PHP代码。
因此,为了定义字符串,您必须 pattern
preg_match
(单引号)或 pattern
(双引号)。
有三种选择:
escape
(双引号)围绕 (')
字符串定义 (")
字符串,然后 pattern
字符串中的每个 (")
(双引号),前面加上 escape
(反斜杠)。(")
(单引号)包围 (\)
字符串,然后 pattern
字符串中的每个 (')
(单引号),前面加上 escape
(反斜杠)。(')
(双引号)包围 (\)
字符串,然后指定每个 {使用 pattern
表示形式的字符串中的{1}} (双引号): (")
。因此,您可以通过以下三种方式之一定义 (")
字符串:
HEX
对于第二种情况, \x22
代码看起来像这样:
pattern