-5

我正在做一个需要获取文档类型和字符集的项目。

事实是我通过另一种方式得到它。但是通过正则表达式获取文档类型和字符集非常困难,因为这可以在 html 中以各种方式告知。

所以任何人都可以帮助我得到这个。

我需要获取 from 之后的所有文本以及<!DOCTYPEfrom<!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有点困难。它可以是以下两种形式之一:

  1. 短的:
    <meta charset='utf-8'>
  2. 长:
    <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使用(')(单引号)或(")(双引号)。

有三种选择:

  1. 通过用(双引号)pattern包围字符串来定义字符串,然后在字符串中的每个(双引号)前面加上(反斜杠)。(")escape(")(\)
  2. 通过用(单引号)pattern包围字符串来定义字符串,然后在字符串中的每个(单引号)前面加上(反斜杠)。(')escape(')(\)
  3. 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] */
于 2013-04-26T20:55:58.193 回答