1

jqueryでブックマークレットを作成しています。このブックマークレットは、ページ上の価格を検索し、各価格が置き換えられるフォントサイズを取得できるはずです。私の最大の難しさは、正規表現で:containsを使用する方法を見つけることです。表示されます:containsは正確なテキストでのみ使用できます。これが私が始めたものです。基本的に私は価格ごとに行き、それでフォントサイズを取得したいと思います。

jQuery(":contains('" + jQuery('body').text().match(/[$€£]\d{1,3}(,?\d{3})?(\.\d{2})?/g)+ "')").each( function() { 
var size = parseInt( jQuery(this).css( 'fontSize' ), 10 ); 
results.push({ size: size, price: price}); 
});
4

2 に答える 2

1

最初に通貨記号を検索してから、$.grep()または$.filter()正規表現を使用して結果を取得できると思います。デモンストレーションのために jsFiddle をまとめてみましょう (すべてのブックマークレットを使用しているわけではないので、ブックマークレット内から jQuery を参照する方法がわかりません)。

編集2

次の例では、最も内側の要素を取得し、$.text()親要素を無視しようとしています。繰り返しになりますが、このメソッドは、価格文字列を持つ複数の内部要素を持つ段落タグのようなものを完全に処理していないのではないかと思います。しかし、それは下にあるものよりもさらに進んでいます。

フィドルにはもう少し冗長なものが表示されますが、次の部分で機能します。

function containsSelector(value) {
  return ':contains(' + value + ')';
}

function groupContainsSelector(list) {
  return $.map(list, containsSelector).join(',');
}

function groupExpression(list) {
  var expression = '[' + list.join('') + ']\\d{1,3}(,?\\d{3})?(\\.\\d{2})?';

  if (!expressions.hasOwnProperty(expression)) {
    expressions[expression] = new RegExp(expression, 'g');
  }

  return expressions[expression];
}

をキャッシュしているRegExpので、既に作成した新しいものを呼び出しているわけではないことに注意してください。

function hasCurrency($el, currency, test) {
  if ($el.children(currency).size()) {
    return false;
  }

  return !!$el.text().match(test);
}

これらの関数を使用して、状況に応じて次のいずれかを使用できます。

$contains = $(currencieselector, document.body);

$filter = $contains.filter(function (i, el) {
  return hasCurrency($(el), currencieselector, groupexp);
});

$grep = $.grep($contains, function (el, i) {
  return hasCurrency($(el), currencieselector, groupexp);
});

$map = $contains.map(function () {
  return !hasCurrency($(this), currencieselector, groupexp) || this;
});

http://jsfiddle.net/userdude/CvYpx/9/

を使用しsetTimeoutて、各メソッドで見つかった要素に適用されるスタイリングの各レイヤーを適用します。以外$containsの 3 つは同じ結果です。また、各宗派を強調しています。

$.each(currencies, function (index, val) {
  $contains.filter(function (i, el) {
    return hasCurrency($(el), containsSelector(val), groupExpression([val]));
  })
  .addClass(denominations[index]);
});

編集

これが多かれ少なかれ私が得ていたものであり、いくつかの不自然な例があります:

<p>Franc: £58,00</p>
<aside>No price</aside>
<p>Dollar: $8.08</p>
<p>Euro: €5.34</p>
<p>No price</p>
<p>SPAN price: <span>€3,00</span></p>
<p>STRONG: <strong>£73.93</strong></p>
<p>EM: <em>$73.93</em></p>

var $contains = $(':contains($),:contains(€),:contains(£)', document.body),
    regex = /[$€£]\d{1,3}(,?\d{3})?(\.\d{2})?/g,
    $filter,
    $grep;

$grep = $.grep($contains, function(n, i){
    console.log($(n).text().match(regex), $(n).text());
    return !!$(n).text().match(regex);
});

$filter = $contains.filter(function(n, i){
    console.log($(i).text().match(regex));
    return !!$(i).text().match(regex);
});

console.log($contains);
console.log($filter);
console.log($grep);

http://jsfiddle.net/userdude/CvYpx/

parent結果に aと a の両方を見つけるという問題があることに注意childしてください。それをしたいかどうかはわかりません。また、私が得意ではない正規表現なので、コメントはありません。完璧ではありませんが、 と の一般的な考え方$.grep()です$.filter()

于 2013-01-12T04:11:59.960 に答える
0

ページ上のすべてのテキスト ノードを取得し、正規表現に一致する各ノードについて、親ノードの計算されたスタイルのフォント サイズを取得します。これは非効率に思えるかもしれませんが、実際にはそうではありません。jQuery は、クエリを評価するために既に同様のことを行う必要がありcontainsます。

于 2013-01-12T04:02:59.450 に答える