Regex работает с regex101, но не с php

У меня есть следующий пример текста

<p>in <span class="nanospell-typo">der</span> <span class="nanospell-typo"><dreipc data-type="abbreviation" data-uid="41">DDR</dreipc></span> <span class="nanospell-typo">kollaborieren</span>, <span class="nanospell-typo">gibt</span> es</p>
<li>per Post an <strong>&lt;dreipc data-type="abbreviation" data-uid="48"&gt;someAbbreviation&lt;/dreipc&gt;, 10106 Berlin</strong> oder</li>

и следующие два шаблона регулярных выражений:

/(?:\<dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:\>)(.*?)(?:\<\/dreipc\>)/
/(?:&lt;dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:&gt;)(.*?)(?:&lt;\/dreipc&gt;)/

Первый Regex работает на regex101.com и в php. Второй соответствует regex101.com, но не соответствует php. Я не понимаю, почему. На самом деле мне нужно только первое регулярное выражение, но тогда я не получаю совпадений, когда есть htmnlentities. Вот почему я включил второй шаблон регулярного выражения. Я также не хочу использовать html_entity_decode в своей строке. Строка в основном очень длинная, и я не хочу декодировать htmlentities, которые могут потребоваться.

Мой php-код выглядит так:

class MyClass {
    const DREIPC_REGEX = '/(?:\<dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:\>)(.*?)(?:\<\/dreipc\>)/';
    const DREIPC_REGEX_HTMLENTITIES = '/(?:&lt;dreipc\ )(?:[^\>]*)(?:data\-type\=\")(.*?)(?:\"\ data\-uid\=\")(.*?)(?:&gt;)(.*?)(?:&lt;\/dreipc&gt;)/';


    public static function pregMatchHTMLNode($string = '')
    {
        $result = [];
        preg_match_all(self::DREIPC_REGEX, $string, $matches, PREG_SET_ORDER, 0);
        preg_match_all(self::DREIPC_REGEX_HTMLENTITIES, $string, $matchesHtmlentities, PREG_SET_ORDER, 0);
        $matches = array_merge($matches, $matchesHtmlentities);

        ... doing some other things with matches
        return $result;
    }
}

Так что лучше всего было бы заставить preg_match_all() работать с моим вторым шаблоном. Но как?


person Falk    schedule 21.05.2018    source источник
comment
Первый шаг: var_dump($string); в pregMatchHTMLNode()   -  person revo    schedule 21.05.2018
comment
... кавычки также были сущностями. Не проверял это.   -  person Falk    schedule 21.05.2018
comment
Не используйте регулярное выражение для обработки HTML: stackoverflow.com/a/1732454/2610466   -  person jhenninger    schedule 21.05.2018
comment
@wakiMiko Спасибо за этот интересный комментарий. Но у меня нет альтернативы замене пользовательского тега чем-то другим. Также мне нужны группы, которые я получаю с помощью своего регулярного выражения.   -  person Falk    schedule 21.05.2018
comment
И на самом деле код работает нормально.   -  person Falk    schedule 21.05.2018


Ответы (1)


Цитаты в моем внешнем выводе не были закодированы, только скобки для моих тегов. Но var_dump() показал, что котировки закодированы. Поэтому я изменил шаблон регулярного выражения на:

(?:&lt;dreipc\ )(?:[^\>]*)(?:data\-type\=&quot;)(.*?)(?:&quot;\ data\-uid\=\&quot;)(.*?)(?:&quot;&gt;)(.*?)(?:&lt;\/dreipc&gt;)

Теперь это работает.

person Falk    schedule 21.05.2018