Как извлечь идентификатор и URL из тега привязки в этом коде, используя PHP? - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь извлечь текст, URL (href) и идентификатор из тега привязки.До сих пор я мог получить текст между тегами привязки.Это мой код

<html>
    <head>
    </head>
    <body>
      <?php
    $html =<a href='https://www.google.lk/' id='21'>Google</a>  <a>Solution</a>"
    preg_match_all('@<(a)>(.+?)</\1>@is', $html, $matches);
    foreach ($matches[2] as $text) {
      print "Text: $text\n";
      echo "<br>";
    }
    ?>
    </body>
    </html>

Это даст следующий результат.

Текст: Решение

Таким образом, я могу напечатать толькотекст между двумя чистыми тегами привязки (без каких-либо параметров).Но это не сработает, когда есть такие параметры, как href и id.Я пытаюсь изменить приведенный выше код для печати текста (между двумя тегами привязки), URL (HREF) и идентификатора следующим образом

Текст: Google URL: https://www.google.lk/ id: 21

Любая помощь будет принята с благодарностью.Спасибо

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Отредактировано, чтобы сделать id / href необязательным

Найти

<a(?=\s|>)(?=(?:(?:[^>"']|"[^"]*"|'[^']*')*?\shref\s*=\s*(?:(['"])([\S\s]*?)\1))?)(?=(?:(?:[^>"']|"[^"]*"|'[^']*')*?\sid\s*=\s*(?:(['"])([\S\s]*?)\3))?)\s*(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>(.*?)</a\s*>

Заменить

Text: $5 URL:$2 id:$4

https://regex101.com/r/SBgqqd/1

Расширен

                               # Begin Anchor tag
 < a
 (?= \s | > )
 (?=                           # Asserttion for optional:  href  (a pseudo atomic group)
      (?:
           (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
           \s href \s* = \s* 
           (?:
                ( ['"] )                      # (1)
                ( [\S\s]*? )                  # (2)
                \1 
           )
      )?
 )
 (?=                           # Asserttion for optional:  id
      (?:
           (?: [^>"'] | " [^"]* " | ' [^']* ' )*?
           \s id \s* = \s*           
           (?:
                ( ['"] )                      # (3)
                ( [\S\s]*? )                  # (4)
                \3 
           )
      )?
 )
                               # Have the href and id, just match the rest of tag
 \s* 
 (?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+

 >                             # End  tag

 ( .*? )                       # (5)
 </a \s* >
0 голосов
/ 01 декабря 2018

Ваш вопрос немного неясен, поэтому, если я правильно понимаю, вы можете легко извлечь содержимое тега привязки (<a>), но если тег <a содержит href и id, то вы думаете, что он выигралне работаетКроме того, согласно заголовку вашего сообщения, вы также хотите извлечь значения атрибутов href и id, и они могут быть или не быть там.И фактически любой из них может отсутствовать.

В этом случае вы можете использовать это регулярное выражение,

<(a)(?:\s+href=(['"])(?<href>[^'"]*)\2\s*)?(?:\s+id=(['"])(?<id>[^'"]*)\4\s*)?>(.+?)<\/\1>

Объяснение:

  • < -> начало тега
  • (a) -> Ожидает, что имя тега будет только `a ', и захватит его в группе 1 для сопоставления с обратной ссылкой в ​​конце закрытия
  • (?:\s+href=(['"])(?<href>[^'"]*)\2\s*)? -> Эта часть соответствует атрибуту href и фиксирует его значение в href именованной группе, которая является необязательной
  • (?:id=(['"])(?<id>[^'"]*)\4\s*)? -> Эта часть соответствует атрибуту id изахватывает значение в id именованной группе, которая также является необязательной
  • > конец <a тега
  • (.+?) -> Captures <a теги внутренний текст
  • <\/\1> -> Соответствует завершающему тегу для <a через обратную ссылку через \1

Это все равно будет соответствовать ссылке группы 1, которая будет a согласно приведенному выше регулярному выражению, так кака также захватит значения атрибутов href и id, оба необязательные.

Вот демонстрационная версия

Позвольте мне знатьау, если это то, что вы хотели.В случае каких-либо запросов, дайте мне знать.

...