正则表达式设置的HTML Doc Type和Char

时间:2013-04-26 18:36:40

标签: php regex

我正在开发一个需要获取doctype和char-set的项目。

事实是我通过另一种方式得到它。但是通过正则表达式获取doctype和char-set是如此困难,因为这可以通过html以各种方式告知。

所以有人可以帮我解决这个问题。

我需要从<!DOCTYPE <!DOCTYPE HTML or more can be here>char-set <meta charset="UTF-8"/>之后得到所有文字。

我想在PHP preg_match函数中使用它。所以,如果有人帮助我,那对我来说非常有用。

1 个答案:

答案 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 稍微困难一些。它可以是以下两种形式之一:

  1. 短:
    <meta charset='utf-8'>
  2. 长:
    <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
  3. 要捕获 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 (双引号)。

    有三种选择:

    1. 使用 escape (双引号)围绕 (') 字符串定义 (") 字符串,然后 pattern 字符串中的每个 (") (双引号),前面加上 escape (反斜杠)。
    2. 通过 (") (单引号)包围 (\) 字符串,然后 pattern 字符串中的每个 (') (单引号),前面加上 escape (反斜杠)。
    3. 通过 (') (双引号)包围 (\) 字符串,然后指定每个 {使用 pattern 表示形式的字符串中的{1}} (双引号): (")
    4. 因此,您可以通过以下三种方式之一定义 (") 字符串:

      HEX

      对于第二种情况, \x22 代码看起来像这样:

      pattern