Я искал решение для этого и пришел, потому что это был первый хит в Google. Второй вариант был для меня чем-то полезен, потому что он имеет очень простое решение, если у вас есть доступ к скрипту PHP и его можно изменить.
Просто вставьте следующие строки в начале вашего скрипта:
/ *, если он запущен из командной строки, оберните параметры в $ _POST и $ _GET * / if (! isset ($ _ SERVER ["HTTP_HOST"])) {parse_str ($ argv [1], $ _GET); parse_str ($ argv [1], $ _POST); }
Эта небольшая часть кода делает трюк (вы можете решить, хотите ли вы использовать $ _GET или $ _POST или, как мне было нужно, оба. После изменения сценария вы можете позвонить это из командной строки, передающей ваши аргументы:
php yourscript.php 'arg1 = x & amp; arg2 = y'
Удачи!
g
в регулярном выражении (short для global ) говорит, чтобы искать всю строку, а не просто найти первое вхождение:
var temp = "This is a string.";
var count = (temp.match(/is/g) || []).length;
console.log(count);
Это соответствует is
дважды. И, если совпадений нет, он возвращает 0
.
var temp = "Hello World!";
var count = (temp.match(/is/g) || []).length;
console.log(count);
Просто кодовое гольф-игра Ребекка Чернофф решение : -)
alert(("This is a string.".match(/is/g) || []).length);
alert(("This is a string.".match(/is/g) || []).length);
, иначе вы получите неопределенную ошибку, если совпадений не найдено.
– Nick
12 October 2013 в 03:30
Для тех, кто найдет этот поток в будущем, обратите внимание, что принятый ответ не всегда возвращает правильное значение, если вы его обобщите, так как он будет задыхаться от операторов регулярных выражений, таких как $
и .
. Вот лучшая версия, которая может обрабатывать любую иглу :
function occurrences (haystack, needle) {
var _needle = needle
.replace(/\[/g, '\\[')
.replace(/\]/g, '\\]')
return (
haystack.match(new RegExp('[' + _needle + ']', 'g')) || []
).length
}
var s = "1";replaced word
var a = "HRA"; //have to replace
var str = document.getElementById("test").innerHTML;
var count = str.split(a).length - 1;
for (var i = 0; i < count; i++) {
var s = "1";
var a = "HRA";
var str = document.getElementById("test").innerHTML;
var res = str.replace(a, s);
document.getElementById("test").innerHTML = res;
}
<input " type="button" id="Btn_Validate" value="Validate" class="btn btn-info" />
<div class="textarea" id="test" contenteditable="true">HRABHRA</div>
Основываясь на ответе @ Vittim.us выше. Мне нравится контроль, который дает мне его метод, что упрощает его расширение, но мне нужно было добавить нечувствительность к регистру и ограничить совпадение целыми словами с поддержкой пунктуации. (например, «ванна» находится в «ванне», но не «купается»)
Регулярное выражение для пунктуации произошло из: https://stackoverflow.com/a/25575009/497745 ( Как я могу отделить все знаки препинания от строки в JavaScript с помощью regex? )
function keywordOccurrences(string, subString, allowOverlapping, caseInsensitive, wholeWord)
{
string += "";
subString += "";
if (subString.length <= 0) return (string.length + 1); //deal with empty strings
if(caseInsensitive)
{
string = string.toLowerCase();
subString = subString.toLowerCase();
}
var n = 0,
pos = 0,
step = allowOverlapping ? 1 : subString.length,
stringLength = string.length,
subStringLength = subString.length;
while (true)
{
pos = string.indexOf(subString, pos);
if (pos >= 0)
{
var matchPos = pos;
pos += step; //slide forward the position pointer no matter what
if(wholeWord) //only whole word matches are desired
{
if(matchPos > 0) //if the string is not at the very beginning we need to check if the previous character is whitespace
{
if(!/[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&\(\)*+,\-.\/:;<=>?@\[\]^_`{|}~]/.test(string[matchPos - 1])) //ignore punctuation
{
continue; //then this is not a match
}
}
var matchEnd = matchPos + subStringLength;
if(matchEnd < stringLength - 1)
{
if (!/[\s\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&\(\)*+,\-.\/:;<=>?@\[\]^_`{|}~]/.test(string[matchEnd])) //ignore punctuation
{
continue; //then this is not a match
}
}
}
++n;
} else break;
}
return n;
}
Не стесняйтесь изменять и реорганизовывать этот ответ, если вы обнаружите ошибки или улучшения .
countInstances("isisisisisis", "is") === 0
.
– Nick Craver♦
24 October 2010 в 19:44
Попробуйте следующее:
function countString(str, search){
var count=0;
var index=str.indexOf(search);
while(index!=-1){
count++;
index=str.indexOf(search,index+1);
}
return count;
}
String.prototype.Count = function (find) {
return this.split(find).length - 1;
}
"This is a string.".Count("is");
Это вернет 2.
Версия без регулярного выражения:
var string = 'This is a string',
searchFor = 'is',
count = 0,
pos = string.indexOf(searchFor);
while (pos > -1) {
++count;
pos = string.indexOf(searchFor, ++pos);
}
console.log(count); // 2
is
вхождения
– vladkras
20 May 2016 в 05:57
Вот самая быстрая функция!
Почему это быстрее?
String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};
Ниже представлена более медленная и более читаемая версия:
String.prototype.timesCharExist = function ( chr ) {
var total = 0, last_location = 0, single_char = ( chr + '' )[0];
while( last_location = this.indexOf( single_char, last_location ) + 1 )
{
total = total + 1;
}
return total;
};
Это медленнее из-за счетчика, длинных имен переменных и неправильного использования 1 var.
Чтобы использовать его, вы просто это делаете:
'The char "a" only shows up twice'.timesCharExist('a');
Редактировать: (2013/12/16)
НЕ использовать с Opera 12.16 или старшая! это будет почти в 2,5 раза больше, чем регулярное выражение!
На хром это решение займет от 14 мс до 20 мс для 1 000 000 символов.
Решение регулярного выражения занимает 11-14 мс для такое же количество.
Использование функции (вне String.prototype
) займет около 10-13 мс.
Вот код:
String.prototype.timesCharExist=function(c){var t=0,l=0,c=(c+'')[0];while(l=this.indexOf(c,l)+1)++t;return t};
var x=Array(100001).join('1234567890');
console.time('proto');x.timesCharExist('1');console.timeEnd('proto');
console.time('regex');x.match(/1/g).length;console.timeEnd('regex');
var timesCharExist=function(x,c){var t=0,l=0,c=(c+'')[0];while(l=x.indexOf(c,l)+1)++t;return t;};
console.time('func');timesCharExist(x,'1');console.timeEnd('func');
результат всех решений должен быть 100 000!
Примечание: если вы хотите, чтобы эта функция подсчитывала более 1 символа, измените, где c=(c+'')[0]
, на c=c+''
Super duper old, но мне нужно было сделать что-то подобное сегодня и только подумать, чтобы проверить SO потом. Работает довольно быстро для меня.
String.prototype.count = function(substr,start,overlap) {
overlap = overlap || false;
start = start || 0;
var count = 0,
offset = overlap ? 1 : substr.length;
while((start = this.indexOf(substr, start) + offset) !== (offset - 1))
++count;
return count;
};
Простая версия без регулярного выражения:
var temp = "This is a string.";
var count = (temp.split('is').length - 1);
alert(count);
Немного поздно, но предположим, что у нас есть следующая строка:
var temp = "This is a string.";
Сначала мы раскалываем все, что вы хотите совместить, это вернет массив строк.
var array = temp.split("is");
Затем мы получаем длину и вычитаем 1 из него, так как split по умолчанию относится к массиву размера 1 и, следовательно, увеличивает его размер каждый раз, когда он находит событие.
var occurrenceCount = array.length - 1;
alert(occurrenceCount); //should output '2'
Вы может также сделать все это в одной строке следующим образом:
alert("This is a string.".split("is").length - 1); //should output '2'
Надеюсь, что это поможет: D
var countInstances = function(body, target) {
var globalcounter = 0;
var concatstring = '';
for(var i=0,j=target.length;i<body.length;i++){
concatstring = body.substring(i-1,j);
if(concatstring === target){
globalcounter += 1;
concatstring = '';
}
}
return globalcounter;
};
console.log( countInstances('abcabc', 'abc') ); // ==> 2
console.log( countInstances('ababa', 'aba') ); // ==> 2
console.log( countInstances('aaabbb', 'ab') ); // ==> 1
Ответа на этот вопрос Leandro Batista: просто проблема с выражением регулярного выражения.
"use strict";
var dataFromDB = "testal";
$('input[name="tbInput"]').on("change",function(){
var charToTest = $(this).val();
var howManyChars = charToTest.length;
var nrMatches = 0;
if(howManyChars !== 0){
charToTest = charToTest.charAt(0);
var regexp = new RegExp(charToTest,'gi');
var arrMatches = dataFromDB.match(regexp);
nrMatches = arrMatches ? arrMatches.length : 0;
}
$('#result').html(nrMatches.toString());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="main">
What do you wanna count <input type="text" name="tbInput" value=""><br />
Number of occurences = <span id="result">0</span>
</div>
function get_occurrence(varS,string){//Find All Occurrences
c=(string.split(varS).length - 1);
return c;
}
temp="This is a string.";
console.log("Total Occurrence is "+get_occurrence("is",temp));
Используйте get_occurrence (varS, string), чтобы найти вхождения обоих символов и строки в String.
var myString = "This is a string.";
var foundAtPosition = 0;
var Count = 0;
while (foundAtPosition != -1)
{
foundAtPosition = myString.indexOf("is",foundAtPosition);
if (foundAtPosition != -1)
{
Count++;
foundAtPosition++;
}
}
document.write("There are " + Count + " occurrences of the word IS");
Обратите внимание: - подсчет подстроки отображается в строке для пошагового объяснения.
Теперь это очень старая нить, с которой я столкнулся, но, как многие из них толкнули свой ответ, вот моя в надежде помочь кому-то с этим простым кодом.
var search_value = "This is a dummy sentence!";
var letter = 'a'; /*Can take any letter, have put in a var if anyone wants to use this variable dynamically*/
letter = letter[letter.length - 1];
var count;
for (var i = count = 0; i < search_value.length; count += (search_value[i++] == letter));
console.log(count);
Я не уверен, что это самое быстрое решение, но я предпочел его для простоты и не использовал regex (я просто не люблю их использовать!) [/ g4]
countOcurrences('Hello...','.')==8
, а не 3
– Vitim.us
9 May 2014 в 04:16
theString.split(myvar).length - 1
, которые вы не можете использовать с простым регулярным выражением
– Steffan
6 November 2017 в 22:53
Попробуйте
<?php
$str = "33,33,56,89,56,56";
echo substr_count($str, '56');
?>
<script type="text/javascript">
var temp = "33,33,56,89,56,56";
var count = temp.match(/56/g);
alert(count.length);
</script>
/** Function that count occurrences of a substring in a string;
* @param {String} string The string
* @param {String} subString The sub string to search for
* @param {Boolean} [allowOverlapping] Optional. (Default:false)
*
* @author Vitim.us https://gist.github.com/victornpb/7736865
* @see Unit Test https://jsfiddle.net/Victornpb/5axuh96u/
* @see http://stackoverflow.com/questions/4009756/how-to-count-string-occurrence-in-string/7924240#7924240
*/
function occurrences(string, subString, allowOverlapping) {
string += "";
subString += "";
if (subString.length <= 0) return (string.length + 1);
var n = 0,
pos = 0,
step = allowOverlapping ? 1 : subString.length;
while (true) {
pos = string.indexOf(subString, pos);
if (pos >= 0) {
++n;
pos += step;
} else break;
}
return n;
}
occurrences("foofoofoo", "bar"); //0
occurrences("foofoofoo", "foo"); //3
occurrences("foofoofoo", "foofoo"); //1
occurrences("foofoofoo", "foofoo", true); //2
Совпадения:
foofoofoo
1 `----´
2 `----´
Я проверил тестовый тест и моя функция более чем в 10 раз быстрее, чем функция соответствия регулярному выражению, отправленная gumbo. В моей тестовой строке длина 25 символов. с 2 вхождениями символа 'o'. Я выполнил 1 000 000 раз в Safari.
Safari 5.1
Benchmark> Общее время исполнения: 5617 ms (regexp)
Benchmark> Общее время исполнения: 881 ms (моя функция в 6.4 раза быстрее)
Firefox 4
Benchmark> Общее время исполнения: 8547 мс (Rexexp)
Benchmark> Общее время исполнения: 634 мс (моя функция на 13,5 раз быстрее)
Изменить: изменения, которые я сделал
Gist
- длина кешированной кешировки
- добавлена листинг типа в строку .
- добавлен дополнительный параметр «allowOverlapping»
- исправленный правильный вывод для «пустого случая подстроки».
substring.length
почти на каждый цикл, вы должны рассмотреть его кеширование вне while
– ajax333221
7 June 2012 в 00:22
occurrences(11,1) //2
, и он все равно будет работать. (Это делается быстрее, чем проверка типов и вызов toString () i>).
– Vitim.us
7 June 2017 в 18:52
Вы можете использовать match
для определения такой функции:
String.prototype.count = function(search) {
var m = this.match(new RegExp(search.toString().replace(/(?=[.\\+*?[^\]$(){}\|])/g, "\\"), "g"));
return m ? m.length:0;
}
return m ? m.length:-1;
.
– Conor O'Brien
20 December 2014 в 04:13
count = (str.match(/is/g) || []).length
для обработки, если у вас нет соответствия. – Matt 29 October 2012 в 14:19RegExp
и передавать строку, которую вы ищете, но в этом случае вам нужно избежать всех метасимволов. В этом случае предпочтительнее использовать чистый струнный подход. – ZER0 9 April 2013 в 02:47