Regex исключающее поведение - PullRequest
0 голосов
/ 28 июля 2010

Хорошо, я знаю, что этот вопрос задавался в разных формах несколько раз, но у меня проблемы с определенным синтаксисом.У меня есть большая строка, которая содержит фрагменты HTML.Мне нужно найти каждый тег ссылки, который еще не имеет атрибута target = (чтобы я мог добавить его по мере необходимости).

^((?!target).)* даст мне текст, ведущий к «target», а <a.+?>[\w\W]+?</a> даст мне ссылку, но я застрял там.Пример:

<a href="http://www.someSite.com>Link</a> (This should be a match)
<a href="SomeLink.whatever target="_blank">Link</a> (this should not be a match).  

Есть предложения?Использование DOM или XPATH на самом деле не вариант, так как этот фрагмент не является правильно сформированным html.

Ответы [ 4 ]

2 голосов
/ 28 июля 2010

Вы преднамеренно злитесь, пытаясь проанализировать HTML с помощью регулярных выражений. Не.

Тем не менее, вы становитесь очень злым, пытаясь сделать все за одно регулярное выражение. В этом нет необходимости; это делает ваш код зависимым от движка регулярных выражений, нечитаемым и, возможно, медленным. Вместо этого просто сопоставьте теги, а затем снова проверьте свои попадания первого этапа с помощью тривиального регулярного выражения /target=/. Конечно, эта символьная строка может встречаться в другом месте в HTML-теге, но смотрите (1) ... вы уже выбросили из окна хорошую практику, так почему бы хотя бы не сделать вещи непонятными, чтобы все могли видеть, что вы делаешь?

0 голосов
/ 28 июля 2010

Я не проверял это и потратил около минуты на написание этого, но для вашего конкретного примера, если вы можете сделать это на стороне клиента, попробуйте это через DOM:

var links = document.getElementsByTagName("a");

for (linkIndex=0; linkIndex < links.length; linkIndex++) {
    var link = links[linkIndex];

    if (link.href && !link.target) {
        link.target = "someTarget"
        // or link.setAttribute("target", "someTarget");
    }
}
0 голосов
/ 28 июля 2010

Вы можете попробовать негативный взгляд так: <a(?!.*?target.*?).*?>[\w\W]+?</a>

0 голосов
/ 28 июля 2010

Если вы настаиваете на том, чтобы делать это с Regex, такой шаблон должен помочь ...

<a(?![^>]*target=) [^>]*>.*?</a>

Технически говоря, отнюдь не идеально, если тег может содержать> в местах, отличных от end, поэтому он не будет работать для всех тегов HTML.

NB. Я работаю с PHP, возможно, вам придется немного изменить синтаксис для Java.

...