仅输出PHP数组括号中不包含HTML标记的值

时间:2017-02-14 03:16:44

标签: php arrays regex

这是一个示例PHP数组,可以很好地解释我的问题

$array = array('1' => 'Cookie Monster (<i>eats cookies</i>)',
               '2' => 'Tiger (eats meat)',
               '3' => 'Muzzy (eats <u>clocks</u>)',
               '4' => 'Cow (eats grass)');

我只需要返回不包含此数组括号括起来的任何标记的值:

- Tiger (eats meat)
- Cow (eats grass)

为此,我将使用以下代码:

$array_no_tags = preg_grep("/[A-Za-z]\s\(^((?!<(.*?)(\h*).*?>(.*?)<\/\1>).)*$\)/", $array);
foreach ($array_no_tags as $a_n_t) {echo "- ".$a_n_t."<br />";}

假设[A-Za-z]可能 \s空格\(左括号< / strong>,^((?!开始标记拒绝声明,<(.*?)(\h*).*?>(.*?)<\/\1>标记本身,).)*$标记拒绝声明的结束\)右括号

没有任何作用。

print_r($array_no_tags);返回空数组。

2 个答案:

答案 0 :(得分:3)

您可以使用以下表达式将字符串与括号内的HTML标记匹配:

/\([^)]*<(\w+)>[^<>]*<\/\\1>[^)]*\)/

然后将PREG_GREP_INVERT flag设置为true,以便只返回不匹配的项目。

$array_no_tags = preg_grep("/\([^)]*<(\w+)>[^<>]*<\/\\1>[^)]*\)/", $array, true);

<强>解释

  • \( - 匹配文字(字符
    • [^)]* - 匹配零个或多个非)个字符的否定字符类
    • <(\w+)> - 捕获与开头元素的标记名称匹配的第一组
    • [^<>]* - 匹配零个或多个非<>个字符的否定字符类
    • <\/\1> - 返回对捕获第一组以匹配结束标记的引用
    • [^)]* - 匹配零个或多个非)个字符的否定字符类
  • \) - 匹配文字)字符

如果您不关心元素标记周围的括号,那么您也可以使用以下简化表达式:

/<(\w+)>[^<>]+<\/\\1>/

同样,你会使用:

$array_no_tags = preg_grep("/<(\w+)>[^<>]+<\/\\1>/", $array, true);

答案 1 :(得分:1)

您的模式看起来有点过于复杂。我认为在否定前瞻中可能是一个简单的模式,它可以检查( )内的任何$array_no_tags = preg_grep("/^(?!.*?\([^)<]*<\w)/", $array); 是不够的。

(

PHP demo at eval.in

这样not match (?! if有一个[^)<]*左括号,后跟)任意数量的characters that are not <<\w,其次是按limit_req_zone t1Limit zone=t1Zone:10m rate=200r/s; limit_req_zone t2Limit zone=t2Zone:10m rate=90r/s; server { location /api{ content_by_lua_block { ngx.req.read_body(); local reqBody = ngx.req.get_body_data() local res = ngx.location.capture("/getTenant", {method=ngx.HTTP_POST,body=reqBody}); local tenantId= res.body; if tenantId== "none" then ngx.log(ngx.ERR, "Tenant not found!"); ngx.say(tenantId); else ngx.req.set_header("x_myTenantId", tenantId) local res2 = ngx.location.capture("/" .. tenantId .."/doApi", {method=ngx.HTTP_POST,body=reqBody}); if res2.status == ngx.HTTP_OK then ngx.say(res2.body); ngx.exit(res2.status); else ngx.status = res2.status ngx.exit(res2.status) end end; } } location /getTenant { internal; #this is not accessible from outside. proxy_pass http://UpStream1/getCustomer; proxy_set_header X-Original-URI $request_uri; } location /tenant1/doApi { internal; #this is not accessible from outside. # Proxy all requests to the AReqUpStream server group proxy_pass http://UpStream2/doApi; limit_req zone=tenant1Zone burst=25; limit_req_log_level notice; } location /tenant2/doApi { internal; #this is not accessible from outside. # Proxy all requests to the AReqUpStream server group proxy_pass http://UpStream2/doApi; limit_req zone=tenant2Zone burst=10 ;#nodelay; limit_req_status 409; limit_req_log_level notice; } } 较小的符号,后跟word character

请记住,有很好的regex tools like regex101可用于测试模式。