2011-12-27 2 views
2

Я в тупике! Я googled и читать, читать и читать, и я уверен, что есть что-то действительно немой, что я делаю неправильно. Это из сценария Greasemonkey, который я не могу для жизни, чтобы я начал инициировать И выполнять правильно. Я пытаюсь соответствовать этому:Регулярное выражение, чтобы получить текст ссылки

<a href="/browse/post/SOMETHING/">**SOMETHING** (1111)</a> 

Вот что я использую:

var titleRegex = new RegExp("<a href=\"/browse/post/\d*/\">(.*) \("); 

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

Я генерировать регулярное выражение с помощью http://regexpal.com/ - В Firefox консоли ошибок я получаю «незавершенная вводную»

+5

HTTP: // StackOverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contains-tags/1732454 # 1732454 – asawyer

+0

для удобства чтения Я всегда предпочитаю литерал регулярного выражения, например. '" вот строка ".match (/ match me/i)' – tomfumb

+0

Мне было бы интересно узнать больше об использовании синтаксического анализатора XML, чтобы выполнить что-то вроде этого. Я в основном пытаюсь изменить существующий скрипт, чтобы выполнить то, что мне нужно, чтобы сделать это - у вас есть хороший пример сценария greasemonkey, который делает такие вещи как ** правильно **? – spazzed

ответ

4

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

Затем \d* соответствует только цифрам. Я предполагаю, что SOMETHING является просто заполнителем, но если бы он содержал что-либо, кроме цифр, это терпило бы неудачу.

Кроме того, вы должны использовать (.*?) (ленивый) вместо (.*) (жадный), или, возможно, вы слишком много согласитесь. Возможно, еще лучше будет ([^(]*).

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

Всего:

var titleRegex = new RegExp("<a href=\"/browse/post/\\d*/\">([^(]*) \\("); 
+0

Это, кажется, работает отлично. Я все еще смущен - для первой отметки кавычки в строке требуется только одна обратная косая черта, но «(« в конце требуется двойное? »В чем причина этого? – spazzed

+1

' \ "' избегает символа кавычки, чтобы вы могли используйте его в строке. \\ выполняет обратную косую черту, чтобы вы могли использовать ее в регулярном выражении, где '\ (' ускользает от круглой скобки, чтобы она соответствовала литералу '(' вместо открытия группы захвата. –

+0

Поскольку первый кавычек в строка убегана, поэтому JavaScript интерпретирует ее как метку кавычек в строковом литерале. Регулярные выражения с удовольствием принимают кавычки, поэтому ее не нужно избегать в регулярном выражении. «(« В конце нужно экранировать в пределах регулярного выражения, а не строки, поэтому вам нужно, чтобы строка JavaScript содержала «\\ (», но JavaScript ест символ обратной косой черты, поэтому, чтобы строка содержала то, что вам нужно »\\\ (« который javascript превращается в строка, которая содержит «\\ (» и передает в регулярное выражение. –

1

Вот простое исправление:

/href=\".*?\">(.*?)\(/ 
2

Общая идея заключается в том, чтобы взять строку HTML, разобрать его в документ (дерево dom elements), затем пройти через него, чтобы извлечь информацию.

Если ссылка была:

<a href="/browse/post/something/"><b>something</b> else</a> 

Сначала пройти по дереву, чтобы найти якорный тег, то:

anchor.textContent // returns "something else" 

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

В простом случае, вы можете создать DIV, затем установите innerHTML в вашей HTML-строку, а затем пересечь его:

var html = '<p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a>'; 
var div = document.createElement("div"); 
div.innerHTML = html; 
var anchors = div.getElementsByTagName("a"); 
for (var i = 0; i < anchors.length; i++) { 
    console.log(anchors[i].textContent); 
} 

Более сложный вариант этого упаковано в jQuery(string) function.

var html = '<div><p><a href="/browse/post/">Lorem</p> <p>Ipsum</p></a></div>'; 
jQuery(html).find("a").each(function() { 
    console.log(jQuery(this).text()); 
}); 

Живой пример: http://jsfiddle.net/ygcFM/

+0

Отличный ответ. Пора мне подобрать книгу о jQuery и DOM, чтобы попытаться изучить этот материал. Мой javascript является «новичком» в лучшем случае. Также - двойное спасибо за ссылку jsfiddle.net! Я не видел этого раньше .... отличный инструмент! – spazzed

Смежные вопросы