Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP正则表达式匹配<;车身风格=…>;及</车身>;标签_Php_Html_Regex_Curl_Match - Fatal编程技术网

PHP正则表达式匹配<;车身风格=…>;及</车身>;标签

PHP正则表达式匹配<;车身风格=…>;及</车身>;标签,php,html,regex,curl,match,Php,Html,Regex,Curl,Match,我有一个cURL函数,它获取指定页面上的所有内容,但我只需要body标记之间的元素。我发现这个漂亮的正则表达式可以匹配和之间的所有内容,这很有效。但是后来我意识到我需要使用cURL-on的其中一个页面实际上有一个带有样式信息的body标签,因此我真正想要匹配的是和之间的所有内容。有人知道与之匹配的正则表达式吗?这是到目前为止我所有的代码 <?php error_reporting(E_ALL); ini_set("display_errors", "1"); $

我有一个cURL函数,它获取指定页面上的所有内容,但我只需要body标记之间的元素。我发现这个漂亮的正则表达式可以匹配
之间的所有内容,这很有效。但是后来我意识到我需要使用cURL-on的其中一个页面实际上有一个带有样式信息的body标签,因此我真正想要匹配的是
之间的所有内容。有人知道与之匹配的正则表达式吗?这是到目前为止我所有的代码

<?php
    error_reporting(E_ALL); 
    ini_set("display_errors", "1");

    $pageToLoad = $_POST['load'];

        function get_data($url) {
            $ch = curl_init();
            $timeout = 5;
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);
            curl_setopt ($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13');
            $data = curl_exec($ch);
            curl_close($ch);
            return $data;
        }

        $html = get_data($pageToLoad);
        $newHtml = preg_match("~<body[^>]*>(.*?)</body>~si", $html, $newHtml);
        print_r($newHtml);
?>

最简单的方法是使用如下正则表达式:

preg_match('|body[^>]*>(.*?)(?=\</body)|si',$html,$match); 

echo $match[1]; 

preg_match('| body[^>]*>(*))(?=\当您尝试将属性作为搜索模式的一部分时,尝试在html中查找模式可能是一个冒险的命题。例如,属性值可以是单引号,也可以是双引号,并且大多数解析器将能够管理,即使有人忘记引用某个内容,或者引号不匹配。因为您只是在查找s指定属性名,这更简单,但仍然存在一些问题,例如,您要查找的属性名是否作为值存在于另一个属性中

(见鬼,原来的简单正则表达式会错误地匹配一些不太可能的字符串,如

因为一个样式属性后面几乎总是跟一个等号,所以我将使用这个事实来查找它。我还将确保匹配一个body元素,而不是像上面示例中那样的一些不可能的变体

<body\s[^>]*style\s*=[^>]*>(.*?)</body>
]*style\s*=[^>]*>(*?)
<>这与原来的正则表达式基本相同,但是在<>代码[>[s^ >] *样式s*= >中间。

  • \s
    确保主体元素后面有空格,因此它只能是主体元素
  • [^>]*
    匹配除
    以外的任何字符0次或更多次
  • style
    与字符串“style”匹配
  • \s*
    允许在样式和等号之间使用空格
  • =
    匹配字符串“=”

  • 我很难想象有一个例子会让这个正则表达式变得混乱,这也不会导致解析器出现问题。我想如果有人在
    之间添加空格,你真的应该使用HTML解析器,因为这正是它们构建的目的。很棒的post@Quentin,mames me认为正则表达式适用于这种情况。我想y喜欢这句话:要求正则表达式被认为是很好的形式,完全禁止处理HTML,但我认为这和要求每个琐碎的HTML处理任务都由一个成熟的解析引擎来处理一样是错误的。更重要的是要了解这些工具及其优缺点esses,这比屈服于下意识的教条主义更重要。@user3121091你的意思是你只想要具有样式属性的元素吗?所以sadsad很好,但不能与asdsa匹配?@Daniel Gimenez--没错。是的!太完美了。谢谢你的帮助!