Regex ловит нежелательного левого полукокса - PullRequest
1 голос
/ 08 июня 2019

Следующее регулярное выражение перехватывает все теги стиля HTML:

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

Первая часть [^ noscript>] используется для игнорирования любого тега стиля, заключенного в тег noscript.

Проблема в том, что шаблон, по-видимому, возвращает нежелательный левосторонний символ, как этого избежать? Посмотрите этот пример https://regex101.com/r/aA6ihs/1/

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Хотя это было бы лучше сделать с парсером HTML, вы можете пропустить все теги <noscript> с помощью (*SKIP)(*FAIL) - попробуйте сопоставить <noscript>...</noscript>, и, если оно совпадет, завершите работу шаблона в конце, и продолжить поиск совпадений после в конце:

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

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

0 голосов
/ 08 июня 2019

Здесь мы просто захватили бы noscript теги, добавили бы оператор if, чтобы игнорировать их, а затем перенастроили бы желаемый результат с помощью простого выражения, такого как:

(<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;}
...