正则表达式捕获不需要的左侧字符

时间:2019-06-08 06:57:35

标签: php regex preg-match

以下正则表达式捕获所有HTML样式标签:

[^noscript\>]<style[^>]*>([^<]+)?<[\s\/]+style>

第一部分 [^ noscript>] 用于忽略由noscript标记包装的任何样式标记。

问题是,该模式似乎返回了不需要的左侧字符,如何避免这种情况?请参见以下示例https://regex101.com/r/aA6ihs/1/

2 个答案:

答案 0 :(得分:1)

虽然最好使用HTML解析器,但可以用<noscript>跳过所有(*SKIP)(*FAIL)标签-尝试匹配<noscript>...</noscript>,如果匹配,失败末尾的样式,并继续在末尾 之后搜索匹配项:

<noscript>.*?<\/noscript>(*SKIP)(*FAIL)|<style[^>]*>([^<]+)?<[\s\/]+style>

https://regex101.com/r/aA6ihs/3

答案 1 :(得分:0)

在这里,我们将简单地捕获noscript标记,添加一个if语句以忽略这些标记,然后将使用一个简单的表达式重新调整所需的输出,例如:

(<noscript>)[\s\S]+?<\/noscript>|<style(.+?)>(.+?)<\/style>

Demo

测试

$re = '/(<noscript>)[\s\S]+?<\/noscript>|<style(.+?)>(.+?)<\/style>/mi';
$str = '<!DOCTYPE html>
<html lang="en-US">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
        <style type="text/css"></style>
<noscript><style>

< / style></noscript>
                    <!-- Twitter Cards Meta by USM  STARTS-->
                <meta name="twitter:card" content="summary" />


        <style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>

<link rel="pingback" href="/xmlrpc.php">
<noscript><style>

< / style></noscript>
        ';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

foreach ($matches as $key => $value) {
    if ($value[1] != '<noscript>') {
        echo $value[3];
    }
}

输出

.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}