鉴于这样的事情:
<!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
有点困难。它可以是以下两种形式之一:
- 短的:
<meta charset='utf-8'>
- 长:
<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
要捕获 的值charset
,正则表达式搜索字符串应为:
<meta[ ]+([^>]*|)(charset=['" ]*([^'"> ][^'">]+[^'"> ])['" ]*|charset=[ ]*([^'"> ][^'">]+[^'"> ]))([^>]*|)>
第三个反向引用 ( \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
注意:pattern
为了匹配
DOCTYPE ,对上面的字符串进行了更正(
"*"
(星号)不合适)。
编辑:
如何使用函数(patterns)
使用上面 的 Regex 搜索字符串: ... PHP
preg_match
preg_match
(来自function.preg-match) 的语法:
preg_match($pattern, $subject, $matches)
pattern:要搜索的模式,作为字符串。
主题:输入字符串。
matches:如果提供了匹配项,则将其填充为搜索结果。$matches[0]将包含与完整模式匹配的文本, $matches[1]将包含与第一个捕获的带括号的子模式匹配的文本,依此类推。
pattern
必须包含在其中,delimiters
这样preg_match
才能判断字符串的Regex-pattern-string
哪一部分是 ,哪一部分是<pattern-modifiers>
(请参阅有关分隔符的内容)。(注:subject
不需要delimiters
)。
字符串的pattern
组成如下:
<opening-delimiter>
Regex-pattern-string
<closing-delimiter>
<pattern-modifiers>
通常,您将使用 a"/"
表示delimiters
,但您可以使用大多数形式的brackets
,或(大多数)任何punctuation
(非字母数字)。
在这种情况下,您"/"
在pattern
字符串中使用 a,因此对于本示例,我们将使用 a"#"
作为分隔符以使其更容易。
对于此示例,我们还将使用 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] */
为第二种情况指定pattern
字符串稍微复杂一些,因为它同时包含(')
(单引号)和(")
(双引号)。
引号实际上不是pattern
字符串中的问题,因为preg_match
将引号视为任何其他字符。这里引号的问题在于编写定义包含pattern
.
因此,为了定义字符串,您必须escape
使用(')
(单引号)或(")
(双引号)。
有三种选择:
- 通过用(双引号)
pattern
包围字符串来定义字符串,然后在字符串中的每个(双引号)前面加上(反斜杠)。(")
escape
(")
(\)
- 通过用(单引号)
pattern
包围字符串来定义字符串,然后在字符串中的每个(单引号)前面加上(反斜杠)。(')
escape
(')
(\)
pattern
通过用(双引号)将字符串括起来来定义字符串(")
,然后使用以下表示形式指定(")
字符串中的每个(双引号):.HEX
\x22
因此,您可以pattern
通过以下三种方式之一定义字符串:
$pattern='#<meta[ ]+([^>]*|)(charset=[\'" ]*([^\'"> ][^\'">]+[^\'"> ])[\'" ]*|charset=[ ]*([^\'"> ][^\'">]+[^\'"> ]))([^>]*|)>#i';
$pattern="#<meta[ ]+([^>]*|)(charset=['\" ]*([^'\"> ][^'\">]+[^'\"> ])['\" ]*|charset=[ ]*([^'\"> ][^'\">]+[^'\"> ]))([^>]*|)>#i";
$pattern="#<meta[ ]+([^>]*|)(charset=['\x22 ]*([^'\x22> ][^'\x22>]+[^'\x22> ])['\x22 ]*|charset=[ ]*([^'\x22> ][^'\x22>]+[^'\x22> ]))([^>]*|)>#i";
对于第二种情况,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] */