抽取规则

[!TIP|style:callout|label:注意事项: 以下紧邻本Copy区域的代码是v1.6.0之后的新版用法,强烈推荐使用|iconVisibility:default|labelVisibility:default|className:block-tip]

//这是v1.6.0之后的新版用法,强烈推荐使用!!!
//无论是单任务还是多任务,一切都是线性配置,非常简单; 
$rule = array( 
    'field1' => ['selector', 'flag', 'range', 'callback'],
    .....................................................,
    'fieldN' => ['selector', 'flag', 'range', 'callback'],
);

//单任务
$task = array(
    'url'  => "http://www.weather.com.cn/weather/101010100.shtml",
    "rule" => $rule,
    'rule_name' =>  'r1',   //如果留空将使用md5($task_id)作为规则名
); 

//多任务
$task = array(
    array(
        "url" => "http://www.weather.com.cn/weather/101010100.shtml",
        "rule" => $rule,
        'rule_name' => 'r1', //如果留空将使用md5($task_id)作为规则名
        "context" => $context,
    ),
    array(
        "url" => "http://www.weather.com.cn/weather/201010100.shtml",
        "rule" => $rule,
        'rule_name' => 'r2', //如果留空将使用md5($task_id)作为规则名
        "context" => $context,
    ),
);

[!WARNING|style:callout|label:注意事项: 以下紧邻本Copy区域的代码是v1.6.0之前的用法,不再推荐使用|iconVisibility:default|labelVisibility:default|className:block-warning] 1、每一条任务URL配置项唯一的对应一条规则配置项,并且指定的规则名必须一一对应;
2、规则域的取值类型只能是数组;
3、对于单条任务,相应规则域的深度即数组的深度只能是2;
4、对于多条任务,相应规则域的深度即数组的深度只能是3;

//这是v1.6.0之前的旧版用法,不再推荐使用!!!
//如果非要使用,注意必须配置context上下文的如下参数:
//$task['context']['force_use_old_style_multitask_args'] = true;
//多条任务分别对应多条规则域,并且依照规则名一一对应
$task = array(
    'rule_name1' => 'http://www.blogdaren.com';
    ...........................................;
    'rule_nameN' => 'http://www.phpcreeper.com';
);

//对于多条任务,可以看到对应规则域的深度是3而且只能是3
$rule = array( 
    'rule_name1' => array(
        'field1' => ['selector', 'flag', 'range', 'callback'],
        .....................................................,
        'fieldN' => ['selector', 'flag', 'range', 'callback'],
    );
    .........................................................,
    'rule_nameN' => array(
        'field1' => ['selector', 'flag', 'range', 'callback'],
        .....................................................,
        'fieldN' => ['selector', 'flag', 'range', 'callback'],
    );
);
  • rule_name
    每一个任务都应当提供一个相对应的唯一的规则名称,这样我们就能很方便的根据规则名索引到想要的数据,注意:如果规则名留空的话,在v1.6.0之前,引擎默认将采用md5($task_url)作为唯一的规则名,有潜在隐患,不再推荐使用,自v1.6.0开始,引擎默认将使用md5($task_id)作为唯一的规则名。

  • selector
    ① 特别注意:这是一个必填项,如果留空,那当前选择器的作用域将会被忽略,即不生效。
    ② 和jQuery选择器一样,其取值可以是:#idName or .className or Html Elements等。

  • flag
    代表数据提取行为或动作,如果留空,默认动作将是text
    attr: 用于获取HTML元素的属性【注意: 此处attr取值为HTML元素的属性名称如src、href等等
    html: 用于获取匹配元素包裹的HTML元素片段
    text: 用于获取HTML元素包裹的文本内容
    css 专门用于获取style属性内容此外支持变种格式:css:*css:prop1,prop2,...,propN

  • range
    用于进一步缩小数据提取范围,取值可以是#idName or .className or Html Element等等。

  • callback
    可以自定义一个回调字符串回调函数,如果需要捕获回调结果,切记务必要返回所期望的数据。
    ① 回调字符串:语义上和PHP原生的回调函数完全一样,但其类型是一个字符串。
    ② 回调函数:即PHP原生的回调函数,其类型是一个Closure闭包,切记虽然局部支持但不要用。
    ③ 特别注意:由于回调函数无法跨进程通信,所以callback应该使用回调字符串而不要写回调函数。
    ④ 特别注意:回调字符串最好用单引号包裹起来,而不要用双引号,不要问为什么,这是最实惠的。
    ⑤ 特别注意:平时怎么写回调函数,那就怎么写回调字符串,否则将一律视为非法格式而忽略回调。
    ⑥ 回调参数:callback有两个参数,形如:function($field_name, $data)。
    ⑦ 参数含义:$field_name代表当前字段名,$data代表过滤到的数据内容。

演示代码

<?php
//以下代码仅仅只是静态演示,我们要考虑到跨进程环境下callback通信的稳定性,
//所以特别注意红色区域的callback是一个回调字符串,而不要写PHP原生回调函数。
$html = "<div><a href='http://www.phpcreeper.com' id='site' style='color:red;font-size:100px;'>PHPCreeper</a></div>";
$rule = array(
    'link_element'  => ['div',      'html'],
    'link_text '    => ['#site',    'text'],
    'link_address'  => ['a',        'href'],
    'link_css1'     => ['a',        'css'],
    'link_css2'     => ['div>a',    'css:font-size'],
    'callback_data' => ['#site',    'text',  [],  'function($field_name, $data){
        return "Hello " . $data;
    }'],  
);  
$data = $parser->extractField($html, $rule, 'rule1');
pprint($data['rule1']);

/*Array
(
    [0] => Array
        (
            [link_element] => <a href="http://www.phpcreeper.com" id="site" style="color:red;font-size:100px;">PHPCreeper</a>
            [link_text ] => PHPCreeper
            [link_address] => http://www.phpcreeper.com
            [link_css1] => Array
                (
                    [color] => red
                    [font-size] => 100px
                )

            [link_css2] => Array
                (
                    [font-size] => 100px
                )

            [callback_data] => Hello PHPCreeper
        )
)*/

results matching ""

    No results matching ""