鉴于这样的事情:
<!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 搜索字符串: ... PHPpreg_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-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] */
为第二种情况指定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] */