在 PHP 中使用正则表达式提取非 HTML 标签

Extraxt nonHTML tags with regular expression in PHP

我正在尝试从字符串中提取非HTML 标签(例如:<!This TAG>)。 我使用下面的正则表达式来提取标签:

$Tags = preg_split('/(<![^>]*[^\/]>)/i', $Content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);

但问题是所有 HTML 评论标签(如 <!-- This One --> )也将被提取。

我可以使用像下面示例这样的技巧来删除评论标签,但仍然会提取它们之间的任何非HTML 标签!

foreach($Tags as $key => $value) {
    if(mb_substr($value, 0, 4) == '<!--')
        continue;
    $CheckTag = mb_substr($value, 0, 2);
    if($CheckTag == '<!') {
        //...
    }
}

例如:

<!--<p>some text here.</p>--> => 工作。

<!-- <!Tag1><!Tag2><!Tag3> --> => 无效! (提取标签 2 和标签 3)

我正在寻找更好的正则表达式来跳过 <!----> 之间的全部内容,谢谢任何提示。

为了更好的视角,这是原始函数:

public function extractFakeTags($Content) {
        $Tags = preg_split('/(<![^>]*[^\/]>)/i', $Content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
        $FakeTags = array();
        $Content = $Tags;
        foreach($Tags as $key => $current) {
            if(mb_substr($current, 0, 4) == '<!--')
                continue;
            $TagBegin = mb_substr($current, 0, 2);
            if($TagBegin == '<!') {
                $TagLength = mb_strlen($current);
                $TagEnd = mb_substr($current, ($TagLength-1), 1);
                if($TagEnd=='>') {
                    $TagName = mb_substr($current, 2, ($TagLength-3));
                    if (array_key_exists($TagName, $FakeTags)) {
                        array_push($FakeTags[$TagName], $key);
                    }
                    else {
                        $FakeTags[$TagName] = array($key);
                    }
                    $Content[$key] = NULL;
                }
            }
        }
        return $FakeTags;
    }

I'm looking for better regular expression to skip entire content between <!-- to -->

要跳过某些内容,请使用 (*SKIP)(*F)。把比如<!--(?s:.*?)-->(*SKIP)(*F)|放在前面:

/<!--(?s:.*?)-->(*SKIP)(*F)|(<![^>]*[^\/]>)/i

没有修改您的实际正则表达式。 Regex101 is good for testing also see Regex FAQ:)