В большинстве случаев HTML и RegEx не сочетаются друг с другом, и при разборе HTML вашей первой мыслью не должно быть RegEx.
Однако в этой ситуации разметка выглядит достаточно простой, чтобы с ней все было в порядке - по крайней мере, до тех пор, пока Еженедельный издатель не изменит способ отображения этой страницы.
Вот функция, которая извлекает данные, захватывает соответствующие строки, сортирует их и помещает обратно:
($ j - jQuery)
function reorderPwList()
{
var Container = $j('#article span.table');
var TargetLines = /^.+?(\d+(?:,\d{3})*) copies\.<br ?\/?>$/gmi
var Lines = Container.html().match( TargetLines );
Lines.sort( sortPwCopies );
Container.html( Lines.join('\n') );
function sortPwCopies()
{
function getCopyNum()
{ return arguments[0].replace(TargetLines,'$1').replace(/\D/g,'') }
return getCopyNum(arguments[0]) - getCopyNum(arguments[1]);
}
}
1011 *
*
И объяснение регулярного выражения, используемого там:
^ # start of line
.+? # lazy match one or more non-newline characters
( # start capture group $1
\d+ # match one or more digits (0-9)
(?: # non-capture group
,\d{3} # comma, then three digits
)* # end group, repeat zero or more times
) # end group $1
copies\. # literal text, with . escaped
<br ?\/?> # match a br tag, with optional space or slash just in case
$ # end of line
(Для удобства чтения я выделил группы - допустимы только пробелы перед «копиями» и после «br».)
Флаги регулярных выражений gmi
используются для g lobal, m ulti-line mode, case- i чувствительного сопоставления.
<Ч />
<СТАРЫЙ ОТВЕТ>
После того, как вы извлекли только текст, который хотите просмотреть (используя DOM / jQuery), вы можете передать его следующей функции, которая поместит соответствующую информацию в формат, который затем можно будет отсортировать:
function makeSortable(Text)
{
// Mark sortable lines and put number before main content.
Text = Text.replace
( /^(.*)([\d,]+) copies\.<br \/>/gm
, "SORT ME$2 $1"
);
// Remove anything not marked for sorting.
Text = Text.replace( /^(?!SORT ME).*$/gm , '' );
// Remove blank lines.
Text = Text.replace( /\n{2,}/g , '\n' );
// Remove sort token.
Text = Text.replace( /SORT ME/g , '' );
return Text;
}
Затем вам понадобится функция сортировки, чтобы убедиться, что числа отсортированы правильно (стандартный метод JS array.sort отсортирует текст и поместит 100 000 до 20 000).
О, и вот краткое объяснение регулярных выражений, используемых здесь:
/^(.*)([\d,]+) copies\.<br \/>/gm
/.../gm a regex with global-match and multi-line modes
^ matches start of line
(.*) capture to $1, any char (except newline), zero or more times
([\d,]+) capture to $2, any digit or comma, one or more times
copies literal text
\.<br \/> literal text, with . and / escaped (they would be special otherwise)
/^(?!SORT ME).*$/gm
/.../gm again, enable global and multi-line
^ match start of line
(?!SORT ME) a negative lookahead, fails the match if text 'SORT ME' is after it
.* any char (except newline), zero or more times
$ end of line
/\n{2,}/g
\n{2,} a newline character, two or more times
</ СТАРЫЙ ОТВЕТ>