хочу автоматом заменить все словоформы одного слова на этоже только обрамленного тего

123
ИМХО
На сайте с 05.01.2008
Offline
42
#11
Miracle:
Ребята, реализовую подобное на пхп., но столкнулся с проблемой, если в тексте уже есть тег <b> смысл ставить еще один, как обойти не знаю

Тут сложнее, имхо, придется делать полный разбор текста. Идете по html-коду от начала до конца.

Натыкаетесь на открывающий тэг, заносите в список активных.

Натыкаетесь на закрывающий тэг, если тэг в списке активных, вычеркиваете из списка.

Натыкаетесь на слово, проверяете не находится ли оно в списке тех которые скрипт должен обрамить тэгом. Если находится, проверяете какие тэги сейчас в списке активных. Если нужного нет, обрамляете.

Проблем с кривым html-кодом будет туева хуча.

Miracle:
разбивать на кол-во слов и делать разные варианты

или не заморачиваться, и обрамить каждое слово по отдельности ;)

С уважением, Константин.
M
На сайте с 20.08.2004
Offline
376
#12
ИМХО:
Тут сложнее, имхо, придется делать полный разбор текста. Идете по html-коду от начала до конца.
Натыкаетесь на открывающий тэг, заносите в список активных.
Натыкаетесь на закрывающий тэг, если тэг в списке активных, вычеркиваете из списка.
Натыкаетесь на слово, проверяете не находится ли оно в списке тех которые скрипт должен обрамить тэгом. Если находится, проверяете какие тэги сейчас в списке активных. Если нужного нет, обрамляете.


Проблем с кривым html-кодом будет туева хуча.

Кривово хтмл и других не нужных тегов не будет, это для своих проектов.

Насчет обрамлять по одиночке , тож не правильный подход :)), с таким же успехом и словоформ не надо

По поводу предложенного вами решения, эти же мысли у меня и в голове, но это не решение :), уж проще после в тексте найти все с тегами, и внутри каждого вырезать все не нужные и записать на старое место, и так циклом ... но ведь не решение :))

Может есть умы которые предложат гениально-простую идею :))

отец сыночка, лапочки дочки и еще одного сыночка
C
На сайте с 17.08.2002
Offline
82
#13

Чтобы удалить лишние теги

$text = preg_replace ('/<b>(*.)<b>(*.)</b>(*.)</b>/Ui', '<b>\\1\\2\\3</b>', $text);
Kolyaj
На сайте с 28.03.2006
Offline
69
#14

Miracle, чтобы не терзать чужие сервера, используйте phpMorphy.

Cage, какая-то загадочная у вас регулярка.

Oniks
На сайте с 22.08.2005
Offline
176
#15

Мое имхо - надо делать так: эксплодите строчку в массив по "<b>", делаете реверс массива, проходите по нему в поисках двойного "</b>", если находите - удаляете лишний и объединяете 2 последующих элемента. Ну а дальше реверсуете массив и имплодите с разделителем "<b>".

Профессиональные услуги фотографа в Москве и области (http://www.oniks-photo.ru/) покупаю стать и ссылки с сайтов про охоту
C
На сайте с 17.08.2002
Offline
82
#16
Kolyaj:
Cage, какая-то загадочная у вас регулярка.

В ней, кстати, не хватает парочки обратных слешей :). Вот так правильно:

$text = preg_replace("/<b>(.*)<b>(.*)<\/b>(.*)<\/b>/Ui", "<b>\\1\\2\\3</b>", $text);
Kolyaj
На сайте с 28.03.2006
Offline
69
#17
Cage:
В ней, кстати, не хватает парочки обратных слешей

В общем случае все равно работать не будет, попробуйте хотя бы на строке "111<b>222<b>333</b>444<b>555</b>666</b>777". Более того, в общем случае регулярками вообще не получится.

Для таких задач испольуется алоритм, на подобие того, что описал ИМХО, только использовать надо не "список активных", а класть теги на стек.

C
На сайте с 17.08.2002
Offline
82
#18
Kolyaj:
В общем случае все равно работать не будет, попробуйте хотя бы на строке "111<b>222<b>333</b>444<b>555</b>666</b>777".

В общем случае не будет работать, безусловно. Но ТС описал свою конкретную проблему, а я предложил ему конкретное решение, очень простое и уже готовое :).

Kolyaj:
Более того, в общем случае регулярками вообще не получится.

while ($text != $old_text) {

$old_text = $text;
$text = preg_replace("/<b>(.*)<b>(.*)<\/b>(.*)<\/b>/Ui", "<b>\\1\\2\\3</b>", $old_text);
}

Я не знаю, насколько этот код будет эффективно (быстро) работать, но он хотя бы будет работать :).

Kolyaj
На сайте с 28.03.2006
Offline
69
#19
Cage:
Я не знаю, насколько этот код будет эффективно (быстро) работать, но он хотя бы будет работать

Вы даже не представляете себе, насколько неэффективно этот код будет работать (хотя бы из-за использования максимальных квантификаторов), в то время как существует алгоритм, требующий всего одного прохода по тексту, да и его можно совместить с поиском самих слов для замены (т.е. издержек на проверку не будет вообще никаких).

З.Ы. Кстати, я имел в виду одни лишь регулярки, без циклов и прочего ;)

M
На сайте с 20.08.2004
Offline
376
#20

Kolyaj, так делитесь как? Это и ищемс :). И еще что бы в общем случае, например любой другой тег, с атрибутами и свойствами?!Cage, Спасибо, подождем Kolyaj.

123

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