[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: найти все позиции подстроки
Страницы: 1, 2
McLotos
Для меня оказалась невыполнимой задача поиска подстроки =(
strpos показывает в какой позиции находится первое вхождение
strrpos показывает в какой позиции находится последнее вхождение
substr_count выводит сколько раз встречается подстрока
А как получить координаты всех найденных подстрок? Допустим если их больше двух?
Ну вот хочу я найти в каких позициях стоят буквы "а" в первом предложении этого поста?

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Zzepish
найдеш способ- скажи. Я сейчас могу сказать только через перебор циклом
vital
preg_match()/preg_match_all()

_____________
"Нужно быть готовым прислушиваться к тем, кто может тебя чему-нибудь научить. Иначе ты никогда не вырастешь."

Откровенно я никому ниразу не нагрубил. А дать подзатыльник зарвавшемуся юнцу, так это и ему на пользу, и мне в удовольствие. © AllesKlar
FatCat
Цитата (Zzepish @ 9.07.2014 - 01:19)
Я сейчас могу сказать только через перебор циклом

Циклом, только не по буквам. Как-то так:
$pos = 0;
$positions = array();
$test = explode($substring, $string);
for($i=0;$i<(count($test)-1);$i++)
{
if($i)$pos += strlen($substring);
$pos += strlen($test[$i]);
$positions[] = $pos;
}


Хотя, если тексты очень большие, и важна производительность - таки циклом по буквам будет наименее затратным для сервера; но код более громоздкий.

_____________
Бесплатному сыру в дырки не заглядывают...
McLotos
Цитата (FatCat @ 9.07.2014 - 16:26)
Хотя, если тексты очень большие, и важна производительность

Ну как бы суть вопроса не в том чтобы найти букву в словах. я просто тут пытаюсь велосипед изобрести - свой парсер =)
Цитата (vital @ 9.07.2014 - 07:37)
preg_match_all()

не показывает позиции, preg_match_all говорит что Да. я нашёл в строке 10 две букв "а" их позиции 1 и 2 =)

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
FatCat
Цитата (SergeySA @ 9.07.2014 - 20:28)
пытаюсь велосипед изобрести - свой парсер =)

Если парсить интернет страницы весом даже несколько сотен килобайт - производительность не критична; можно и эксплодить по искомому слову.

_____________
Бесплатному сыру в дырки не заглядывают...
McLotos
FatCat
всё проще. есть шаблоны написанные на чистом html без добавления чего-либо кроме специальных тегов

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
FatCat
Цитата (SergeySA @ 9.07.2014 - 20:59)
есть шаблоны написанные на чистом html без добавления чего-либо кроме специальных тегов

Так может быть интереснее рассплитовать по строкам и выбирать номера строк с вхождением искомых тегов? wink.gif

_____________
Бесплатному сыру в дырки не заглядывают...
McLotos
FatCat
так я так и делаю =)
Вот смотри. Я принимаю 3 файла, создаю из них нумерованный массив, каждый элемент массива это строка из файла пропущенная через trim, ну например
    [0] => <!DOCTYPE html>
[
1] => <html>
[
2] => <head>
[
3] => <meta charset="utf-8" />
[
4] => <meta name="robots" content="all">
[
5] => <!--[if lt IE 9]><script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script><![endif]-->
[
6] => <title>TVSHOP.KZ-{HEAD.Title}</title>
[
7] => <meta name="keywords" content="{HEAD.KeyWords}" />
[
8] => <meta name="description" content="{HEAD.Description}" />
[
9] => <meta name="author" content="{HEAD.Author}" />
[
10] => <script src="{HEAD.Scripts}"></script>
[
11] => <link rel="shortcut icon" href="/templates/tvs/img/favicon.ico" type="image/x-icon">
[
12] => <link href="{HEAD.Styles}" rel="stylesheet">
[
13] => </head>

Видишь там есть {SPECIAL.Tag}?
Для замены этих слов у меня есть специальная функция.
Моя функция принимает массив в формате
['HEAD']['Title'] = 'Название страницы';
[
'HEAD']['KeyWords'] = 'Ключевые,слова';

и т.д.
Дальше она ищет в массиве шаблона эти слова и заменяет их на значения.
Но вот если ей попадается ситуация, когда для одной переменный заданы несколько значений
['HEAD']['Scripts'][0] = 'ajax.js';
[
'HEAD']['Scripts'][1] = 'scripts.js';

Она замену не делает, потому-что не знает как вставить сразу оба скрипта.
В данном конкретном примере, можно просто добавить следующим элементом массива копию предыдущего элемента, но с другим значением.
А если это целый DIV, а не просто имя скрипта? Понимаешь о чем я?
Ну вот как например заставить функцию скопировать див много раз и каждый раз подставлять новые значения? Рекурсией? Вариант, но не стабильный, я пробовал, например вот тут
<div id="goods">
<div
class="block" id="{GOODS.Name}">
<div
class="name">
<a
href="{GOODS.Link}"><h2>{GOODS.Name}</h2>{GOODS.Descr}</a><img src="{GOODS.Logo}"/>
</div>
<div
class="image"><img src="{GOODS.Image}"></div>
<input
type="checkbox" id="{GOODS.Id}" name="{GOODS.Name}" value="{GOODS.Value}" class="buy"/>
<label
for="{GOODS.Id}">
<span
class="checked">В корзину</span>
<span
class="unchecked">Убрать</span>
</label>
<span
class="price">{GOODS.Price} T</span>
<div
class="description">{GOODS.Description}</div>
</div>
</div>

Это блок в котором отображается информация о товаре. Таких блоков на странице может быть от одного до нескольких десятков. Как заставить скрипт продублировать именно эту часть массива, столько раз, сколько товаров пришло?
Это можно было бы легко сделать. если бы каким-то образом можно было получить точные координаты {SPECIAL.Tag}. т.е. номер строки и пизицию в строке, а дальше составив карту HTML просто скопировать несколько раз карту этого блока и вставить его в массив

_____________
программирование - инструмент для решения конкретных задач, любая попытка спроектировать что-то универсальное приведет к провалу.©paul85
В любом случае тебе прийдётся пройти путь изобретения велосипеда, который прошли другие, только причиной твоего изобретения будет непонимание принципов работы велосипеда изобретённого другими людьми.©SlavaFr
jQuery это попытка использовать АН-225 для перевозки зубочистки
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.