最初に通貨記号を検索してから、$.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()
。