Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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_Regex_Preg Match - Fatal编程技术网

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

Php 正则表达式捕获不需要的左侧字符,php,regex,preg-match,Php,Regex,Preg Match,以下正则表达式捕获所有HTML样式标记: [^noscript\>]<style[^>]*>([^<]+)?<[\s\/]+style> [^noscript\>]*>([^]用于忽略由noscript标记包装的任何样式标记 问题是,该模式似乎返回了一个不需要的左侧字符,如何避免这种情况?请参见此示例虽然使用HTML解析器会更好,但您可以使用(*skip)(*FAIL)跳过所有标记-尝试匹配…,如果匹配,则在结束时使模式失败,并在结束后继续搜索匹配项:

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

[^noscript\>]<style[^>]*>([^<]+)?<[\s\/]+style>
[^noscript\>]*>([^]用于忽略由noscript标记包装的任何样式标记


问题是,该模式似乎返回了一个不需要的左侧字符,如何避免这种情况?请参见此示例虽然使用HTML解析器会更好,但您可以使用
(*skip)(*FAIL)跳过所有
标记
-尝试匹配
,如果匹配,则在结束时使模式失败,并在结束后继续搜索匹配项:


*?(*SKIP)(*FAIL)|]*>([^在这里,我们只需捕获
noscript
标记,添加
if
语句以忽略这些标记,然后我们将使用一个简单的表达式重新调整所需的输出,例如:

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

谢谢你的回答,但我在这里没有其他选择!如果你能将正则表达式应用于某些HTML文本,你也可以正确地解析它。所以,是的,你有选择。@Peter我试过DOMDocument()它不能正常工作。它只是修改了解析的HTML,这绝对不是一个需要考虑的问题。我知道这意味着额外的工作,但是我可以建议添加另一个问题,那就是你如何在DoMoD文档中解决它,什么失败了,也许我们可以帮助你解决这个问题。
(<noscript>)[\s\S]+?<\/noscript>|<style(.+?)>(.+?)<\/style>
$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;}