Regex не захватывает при отсутствии атрибута HTML-тега - PullRequest
0 голосов
/ 29 апреля 2018

У меня возникают проблемы с тем, чтобы это регулярное выражение работало, когда ссылка 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>

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

1 Ответ

0 голосов
/ 29 апреля 2018

Отвечая на мой вопрос и после нескольких попыток решить проблему с помощью регулярных выражений, как указано в проблеме, а также с помощью людей, которые пришли сюда, чтобы попытаться помочь мне, я нашел решение, которое работает для отсутствующий атрибут 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="" из элемента, и теперь, даже если один из них не удался, другие возвращают совпадение.

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

...