Посчитать кол-во раз повтора строки в переменной на PHP

12
T
На сайте с 28.06.2007
Offline
82
2194

Кто может, помогите пожалуйста!

Необходимо с помощью PHP вычислить какое количество раз повторяется слово в переменной.

Пробовал так:


<?php
$abc='tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf
tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf';
$gg=eregi('tumsov', $abc);
$tt=0;
while ($gg==1)
{
$tt++;
}
echo $tt;
?>

Вечный цикл получается потому что функция eregi каждый раз с начала проверяет присутствие tumsov в $abc, пробовал разнообразными функциями, но необходимой так и не нашёл :(.

Подскажите пожалуйста как можно решить данную задачу.

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#1
• Контекстные ссылки с внутренних страниц навсегда (/ru/forum/370882) • Качественные сайты для заработка на контекстной рекламе и ссылках
T
На сайте с 28.06.2007
Offline
82
#2

СКОРПИОН, СПАСИБО ОГРОМНОЕ!

Сделал так:


<?php
$abc='tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf
tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf';
preg_match_all ('tumsov', $response, $matches);
$mas = count($matches[0]);
echo $mas;
?>

Всё заработало как надо :).

А я так долго думал как же решить проблему :).

СПАСИБО ОГРОМНОЕ!

СКОРПИОН
На сайте с 05.01.2006
Offline
120
#3

Trol, да не за что. Только ещё проще - count не нужен, т.к. preg_match_all:


возвращает количество полных совпадений с патэрном (это может быть нуль), или FALSE при ошибке

В данной ситуации, вот такой код будет более быстрым:


$mas = preg_match_all($pattern, $subject, $matches);
echo $mas?$mas:0;
T
На сайте с 28.06.2007
Offline
82
#4
СКОРПИОН:

Вот такой код будет более быстрым:

$mas = preg_match_all($pattern, $subject, $matches);
echo $mas?$mas:0;

СКОРПИОН, вы гений :)

Дмитрий
На сайте с 23.08.2006
Offline
222
#5

Вкрались у меня сомнения по поводу быстроты и правильности решения, вот тест:

$abc='tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf 

tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf';

$queryStartTime = microtime(true);
$mas = preg_match_all('/tumsov/', $abc, $matches);
$queryEndTime = microtime(true);

echo '<p><i>preg_match_all</i> - ', $queryEndTime - $queryStartTime, '. ', $mas, ' совпадений</p>';

$queryStartTime = microtime(true);
str_replace('tumsov', '', $abc, $mas);
$queryEndTime = microtime(true);

echo '<p><i>str_replace</i> - ', $queryEndTime - $queryStartTime, '. ', $mas, ' совпадений</p>';

А вот результаты:

preg_match_all - 6.7949295043945E-5. 12 совпадений

str_replace - 1.9073486328125E-5. 12 совпадений

Получается str_replace быстрее более чем в 3 раза preg_match_all. Так что неиспользуйте рег. выражения там, где они по сути и ненужны ;)

Разрабатываю и автоматизирую на php http://jonnyb.ru/
СКОРПИОН
На сайте с 05.01.2006
Offline
120
#6
Trol:
СКОРПИОН, вы гений :)

Не буду скромничать, но это, всё-таки, опыт, перешедший в привычку....

JonnyB:
Получается str_replace быстрее более чем в 3 раза preg_match_all. Так что неиспользуйте рег. выражения там, где они по сути и ненужны ;)

JonnyB, это и без расчётов понятно, что str_replace быстрее регулярок.

Тут дело в другом - тот код, который Вы привели, будет работать только на пятом PHP.

Так можно писать только под конкретный проект, заранее зная, что он будет эксплуатироваться именно на этой платформе. Уверенности в том, что у ТС именно пятёрка у меня не было (особенно учитывая то, что он использовал eregi, значит обычные строковые функции уже посмотрел), поэтому я дал код, который будут работать везде...

Дмитрий
На сайте с 23.08.2006
Offline
222
#7

СКОРПИОН, для извращенцев при выборе хостинга можно предложить еще 1 вариант, тоже быстрее preg_match_all:

<?php


$abc='tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf
tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf tumsov fdng djfd gdfjgf jgf';

$queryStartTime = microtime(true);
$mas = preg_match_all('/tumsov/', $abc, $matches);
$queryEndTime = microtime(true);

echo '<p><i>preg_match_all</i> - ', $queryEndTime - $queryStartTime, '. ', $mas, ' совпадений</p>';

$queryStartTime = microtime(true);
$mas = count(explode('tumsov', $abc)) - 1;
$queryEndTime = microtime(true);

echo '<p><i>count + explode</i> - ', $queryEndTime - $queryStartTime, '. ', $mas, ' совпадений</p>';

результаты теста:

preg_match_all - 6.7949295043945E-5. 12 совпадений

count + explode - 2.6941299438477E-5. 12 совпадений
R.Major
На сайте с 23.03.2008
Offline
25
#8
Пишу на PHP (+JS) (/ru/forum/507055)
Дмитрий
На сайте с 23.08.2006
Offline
222
#9

Гыыы, R.Major, не пали фишки 😆

preg_match_all - 6.6995620727539E-5. 12 совпадений

str_replace - 2.0027160644531E-5. 12 совпадений

count+explode - 2.598762512207E-5. 12 совпадений

substr_count - 1.0013580322266E-5. 12 совпадений

Ппц, а мы тут велосипед изобретаем. :) Зачет!

[Удален]
#10

мде, учите матчасть, только мажор ее знает))

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий