Регулярное выражение должно соответствовать URL категории сайта, но соответствует / - PullRequest
0 голосов
/ 30 ноября 2009

регулярное выражение

\<div class=g\>.*?\<a href=\"?(http:\/\/stackoverflow.com\/)\"?.*?\>.*?\<a href=\"?(.+?)\"?.*?\>.*?\<\/div\>

цель

<div class=g>
  <link rel=prefetch href="https://stackoverflow.com/">
  <h2 class=r>
    <a href="https://stackoverflow.com/" class=l onmousedown="return rwt(this,'','','dres','1','AFQjCNERidL9Hb6OvGW93_Y6MRj3aTdMVA','&amp;sig2=ybSqh-7yEKCGx_2MNIb7tA')">
      <em>Stack Overflow</em>
    </a>
  </h2>
  <table border=0 cellpadding=0 cellspacing=0>
    <tr>
      <td class=j>
        <font size=-1>
          <span class=f>Categoria: </span>
          <a href="/Top/Computers/Programming/Resources/Chats_and_Forums/?il=1">Computers&nbsp;&gt;&nbsp;Programming&nbsp;&gt;&nbsp;Resources&nbsp;&gt;&nbsp;Chats&nbsp;and&nbsp;Forums</a>
          <br>A language-independent collaboratively edited question and answer site for programmers. Questions and answers displayed by user votes and tags.<br>
          <span class=a><b>stackoverflow</b>.com/</span>
        </font>
      </td>
    </tr>
  </table>
</div>

должно соответствовать всем, https://stackoverflow.com/ и / Top / Компьютеры / Программирование / Ресурсы / Chats_and_Forums /? Il = 1, но соответствует всем, https://stackoverflow.com/ и /

Почему?

Ответы [ 3 ]

1 голос
/ 30 ноября 2009

Я определенно не один из тех "ооо, вы сказали, что HTML и регулярное выражение в одном предложении, вы должны умереть" -типы, но это явно не та ситуация, когда регулярное выражение является лучшим инструментом для работы. (И при этом это даже не хороший инструмент, ни действующий инструмент).

Проанализируйте его с помощью синтаксического анализатора XML / HTML и избавьте себя от множества неприятностей и злоупотреблений со стороны своих коллег.

1 голос
/ 30 ноября 2009

Проблема в том ...

(.*?)

Почему вы ставите здесь знак вопроса? С этим подарком вы получаете только «/» в своем поиске, потому что? обеспечивает ноль или один возврат. Если вы замените его следующим ...

([^"]+)

При поиске всех значений, которые не являются двойными кавычками, вы должны получить все, href stackoverflow и другой href, который вы упомянули

Я не совсем уверен, зачем ты это делаешь. Возможно, вы используете регулярные выражения, когда вам это не нужно. Какова цель этого регулярного выражения, оно кажется излишним.

1 голос
/ 30 ноября 2009

Это потому, что ваше регулярное выражение во второй группе совпадает неохотно (например, несоответствие). Подробнее об этом см .: http://www.regular -expressions.info / repeat.html особенно параграф Лень вместо жадности .

Вот почему это не работает так, как вы ожидали.

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...