Nano Hash - криптовалюты, майнинг, программирование

Регулярное выражение не захватывает при отсутствии атрибута тега html

У меня возникли проблемы с работой этого регулярного выражения, когда ссылка html не имеет href="http://www.example.com". <ul class='social'>(...)</ul> всегда присутствует на каждой странице, но некоторые теги привязки пропускают атрибут href.

Именно здесь мои попытки терпят неудачу, потому что, когда есть href="", я могу захватить группу с помощью

<a href="(.*?)" id="facebooklink" style="display:none;" class="facebook facebooklink" title="Become a fan on Facebook">Become a fan on Facebook<span></span></a>

С другой стороны, когда случай подобен приведенному ниже, если один или несколько href отсутствуют, он не будет захватывать даже те, которые имеют атрибут и значение href. В моем примере ниже он должен захватить как минимум группу https://twitter.com/StackOverflow.

Регулярное выражение, которое я использую, можно увидеть здесь: https://regex101.com/r/iJ9tC7/12

<ul class="social">
    <li>
        <a id="facebooklink" style="display:none;" class="facebook facebooklink" title="Become a fan on Facebook">Become a fan on Facebook<span></span></a>
    </li>
    <li>
        <a href="https://twitter.com/StackOverflow" id="twitterlink" style="display:none;" class="twitter twitterlink" title="Follow us on Twitter">Follow us on Twitter<span></span></a>
    </li>
    <li>
        <a id="linkedinlink" style="display:none;" class="linkedin linkedinlink" title="Follow us on LinkedIn">Follow us on LinkedIn<span></span></a>
    </li>
</ul>

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

28.04.2018

  • Я в замешательстве. Регулярное выражение, на которое вы ссылаетесь, очевидно, не может соответствовать, если оно ожидает href в том месте, где в тексте есть id. Если один единственный токен регулярного выражения не может соответствовать, все регулярное выражение терпит неудачу. Похоже, вы ожидаете, что части регулярного выражения каким-то образом найдут способ сопоставиться независимо от остальной части регулярного выражения. Ты? Это не то, как работают регулярные выражения. 29.04.2018
  • Что я пытаюсь сделать, так это то, что в случае отсутствия href в одном из элементов, по крайней мере, он будет соответствовать другим, у которых он есть. Условное регулярное выражение, которое я действительно не знаю, как это сделать. Я даже пробовал (?:(href="(.*?)")), но безуспешно. 29.04.2018
  • Я не думаю, что это возможно только с одним регулярным выражением. Вы можете сначала найти теги ul, а затем выполнить поиск по этим подстрокам. Но в целом регулярные выражения не являются хорошим инструментом для сопоставления HTML. 29.04.2018
  • Думаю, у меня есть решение этой проблемы. Я буду тестировать, и если он будет работать так, как ожидалось, я опубликую его здесь как ответ, который решит проблему. 29.04.2018
  • Будет ли это работать для вас? <a.*(?:href="([^"]+?)").*<\/a> 29.04.2018
  • Спасибо, Мэтт, но это не так. Я публикую решение, которое работает. Своего рода хак, но он работает как шарм, хотя и немного дороже. 29.04.2018

Ответы:


1

Отвечая на мой вопрос и после нескольких попыток решить проблему с регулярным выражением, как указано в проблемах, а также с помощью людей, которые пришли сюда, чтобы попытаться помочь мне решить проблему, я нашел решение, которое работает для отсутствующих href="" атрибут элемента.

Поскольку результат curl может быть с ним или без него, но блок всегда есть, я просто добавил следующий php-код для трех ссылок:

$result = str_replace('<a id="facebooklink"','<a href="NULL" id="facebooklink"', $result);
$result = str_replace('<a id="twitterlink"','<a href="NULL" id="twitterlink"', $result);
$result = str_replace('<a id="linkedinlink"','<a href="NULL" id="linkedinlink"', $result);

Это делает то, что добавляет отсутствующий href="" из элемента, и теперь, даже если один терпит неудачу, другие возвращают совпадение.

Это своего рода взлом и немного дорого, но на данный момент это не так беспокоит, поскольку система очень хорошо с этим справляется.

28.04.2018
  • Довольно хакерский :-) Почему бы вам не получить содержимое div с /<ul class="social">(.*)<\/ul>/gUms и не искать каждую ссылку с чем-то вроде /<a href="(.*?)" id="twitterlink"/gUms. Оберните его функцией, чтобы вернуть карту трех адресов ссылок. 29.04.2018
  • Я пробовал этот Кристоф, но нашел несколько несоответствий по пути. Эта хакерская система работает как часы :) Никаких сбоев. Спасибо кстати. 29.04.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..