Ответы пользователя по тегу PHP
  • Как указать границы блока для preg_match_all?

    @KraydenSharp
    Senior RegExp Developer
    Парсить HTML при помощи регулярных выражений довольно сложно.
    Вот пример регулярного выражения, который вам нужен https://regex101.com/r/Yxki2K/1/ .
    Получилось довольно много всего, но, в случае чего, изменив первые 3 группы в DEFINE можно легко искать другие теги.
    Для того, чтобы понять всё, что там понаписано я оставил комментарии.
    Если кто-то всё-таки будет использовать это, то учтите, что эта регулярка не учитывает вложенные друг в друга элементы, подходящие под селектор ul.ul, ul[class="ul"] и местами не валидный HTML.

    $re = '/(?(DEFINE) #Это блок с объявлением функций
    
        #Этот блок - единственное место, где нужно подставлять значения
        (?<tagName>ul) #Имя тега
        (?<attrName>class) #Атрибут тега
        (?<attrValue>ul) #Значение тега
    
        (?<anyAttrName>[^\s\>\=]*+) #Любое название атрибута
        (?<anyAttrValue>\"[^\"]*+\"|\'[^\']*+\'|\`[^\']*+\`|[^\s\>]*+) #Любое значение атрибута
        (?<anyAttr>(?&anyAttrName)\s*+(?:\=\s*+(?&anyAttrValue)\s*+)?+) #Любой атрибут
    
        #Если нужно найти точное вхождение значения атрибута
        (?<attr>
            (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута
            (?: #Поиск точного вхождения
                \"(?&attrValue)\"|
                \'(?&attrValue)\'|
                \`(?&attrValue)\`|
                (?&attrValue)(?=[\s\>])
            )
        )
    
        #Если нужно искать в атрибуте значение как в классах
        (?<attrClass>
            (?&attrName)\b\s*+\=\s*+ #Нужное нам название атрибута
            (?: #Поиск значения как в классах
                \"[^\"]*?\b(?&attrValue)\b[^\"]*+\"|
                \'[^\']*?\b(?&attrValue)\b[^\']*+\'|
                \`[^\`]*?\b(?&attrValue)\b[^\`]*+\`|
                (?&attrValue)(?=[\s\>])
            )
        )
    
        #В зависимости от того, какую из 2 функций выше мы хотим использовать для проверки атрибута
        #Строгое сравнение значения
        (?<tag>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attr)(?&anyAttr)*?\>) #Использовать так: (?&tag)
        #Поиск значения как в классах
        (?<tagClass>\<(?&tagName)\b\s*+(?&anyAttr)*?(?&attrClass)(?&anyAttr)*?\>) #Использовать так: (?&tagClass)
    
    ) #Этот огровный блок с функциями закончился
    
    (?:[^\<]++(*SKIP)|\G|\C*?(?<parentTag>(?&tagClass)))[^\<]*+\K #После того, как нашли тег сбросили состояние нулевой группы
    (?<openTag>\<li\b\s*+(?&anyAttr)*+\>) #У тега могут быть атрибуты
    (?<innerHTML>\C*?) #Внутреннее содержимое тега
    (?<closeTag>
        \<\/li\b\s*+(?&anyAttr)*+>| #В HTML у закрывающих тегов нет атрибутов, но HTML от этого не ломается
        (?=(?&openTag))| #Теги элементов списка необязательно закрывать согласно документации
        (?=(?<closeParentTag>\<\/ul\b\s*+(?&anyAttr)*+\>)) #Закрытие списка закрывает последний элемент
    )/xuJi';
    $str = '<ul>
        <li class="li anyClass">aaa</li>
        <li>bbb
        <li>ccc
    </ul>
    <p>какой-то текст</p>
    <ul data-class="ul anyClass" class="ul anyClass" data-id=`ul` id=\'ul\' data-data=ul data-empty>
        <li class="li anyClass">aaa</li>
        <li >aaa</li>
        <li>bbb
        <li>ccc
    </ul>
    <p>какой-то текст</p>
    <ul>
        <li class="li anyClass">aaa</li>
        <li>bbb
        <li>ccc
    </ul>
    <p>какой-то текст</p>
    <ul data-class="ul anyClass" class="ul anyClass" data-id=`ul` id=\'ul\' data-data=ul data-empty>
        <li class="li anyClass">aaa</li>
        <li>bbb
        <li>ccc
    </ul>
    <p>какой-то текст</p>
    <ul>
        <li class="li anyClass">aaa</li>
        <li>bbb
        <li>ccc
    </ul>';
    
    preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);
    
    // Print the entire match result
    var_dump($matches);
    Ответ написан
    Комментировать
  • Нужна помощь - распарсить сайт с целью получения данных?

    @KraydenSharp
    Senior RegExp Developer
    Ответ написан
    Комментировать
  • Как обработать переменные внутри регулярного выражения?

    @KraydenSharp
    Senior RegExp Developer
    В ситуациях, когда необходимо обработать вхождения регулярного выражения функцией, используют preg_replace_callback
    Ответ написан
    5 комментариев
  • Почему не приходят письма на почты?

    @KraydenSharp
    Senior RegExp Developer
    Для отправки писем лучше использовать SMTP. Без этого письма на mail, gmail и yandex почты могут не приходить.

    Update.
    Вот хорошая статья по этому поводу https://snipp.ru/php/smtp-phpmailer
    Многое из неё можно без изменений вставлять в проект.
    Также ниже приведены параметры для работы со многими популярными в России почтовиками.
    Ответ написан
    2 комментария
  • Как правильно написать регулярное выражение для каталога в битрикс?

    @KraydenSharp
    Senior RegExp Developer
    Обычно в bitrix такие вещи делаю на этой странице domain.ru/bitrix/admin/urlrewrite_list.php

    Для каталога должны получиться примерно такие правила.

    #^/catalog/([^/]+)/([^/]+)/#			/catalog/detail.php		ELEMENT_CODE=$2
    #^/catalog/([^/]+)/#				/сatalog/section.php		SECTION_CODE=$1
    #^/catalog/#					/сatalog/index.php
    Ответ написан
    Комментировать
  • Регулярные выражения. Как посчитать количество значений разделенных символом?

    @KraydenSharp
    Senior RegExp Developer
    Есть такой способ.
    $xR = preg_match_all("/[^,]+/",$data_point[2],$regD);

    В этом случае не будут учитываться пустые значения.
    Ответ написан
    4 комментария