Регулярное выражение.

Solid

Drosera anglica
Регулярное выражение.

Не могу уже. Несколько раз по часа 3 сидел, пробовал наконец-таки написать - не получилось. Очень скудно получалось, работало на половину, на больше сдвинуться не удавалось.
В общем, есть у нас слово:
$word = 'word';
и есть, к примеру, текстовая строка, вроде:
$text = '<h1>here is many words and a word at the end</h1>So here is another text, where is we can see the <img src="bla.gif" alt="some word here"> and so on. Another words, and many more.';
Что надо?
Надо заменить слово word только в тексте, ни в коем случаем не между <h1></h1>, не в alt в img, и плюс в добавок ещё нельзя заменять слово words или someword, т.е. только строго word и только в тексте. Бился по разному, делал через ereg_replace();
Подскажите, как решить, не могу уже.
 

ForJest

- свежая кровь
Одной регой этого не решишь в силу того, что автоматная грамматика не решает задачи контекстно зависимых грамматик.
Распарси HTML поэлементно и меняй в своё удовольствие.
 

alexhemp

Новичок
Solid

Алгоритм такого рода известен, самый простой вариант

1. Регуляркой "выкуси" все теги со всем содержимым в массив, заменив на спец-символ, заведомо не встречающийся в данном тексте (например 0x01 для HTML документа)
2. Регуляркой сделай выделение
3. Вставь теги обратно заместо спец-символов
 

Solid

Drosera anglica
Да не верю, что обычным ereg_replace'ом не сделать. Ведь можно же: "([^h1.*>][^img][^\s])(.*)([^\s][^>][^h1])"
Но только не работает, почему?
 

Solid

Drosera anglica
Хм, за ссылочку спасибо. Но я и на php.net уже вдоволь этим всем обчитался. Вроде всё же правльно, а? От чего не работает?
 

SiMM

Новичок
> Вроде всё же правльно
Переведи приведённое тобой регулярное выражение на русский язык - и всё встанет на свои места.
 

Solid

Drosera anglica
А помочь с правильным кодом никак? Я б заодно и ошибку свою понял.
 

Anarki

Новичок
Solid
Интересно, а в POSIX регулярках, это означает "не строка h1"?
PHP:
[^h1]
 

Solid

Drosera anglica
Автор оригинала: Anarki
Solid
Интересно, а в POSIX регулярках, это означает "не строка h1"?
PHP:
[^h1]
Так точно... неужели не сказать код? Ведь если знаете, помогите.

-~{}~ 14.09.05 16:39:

Неужто никто не знает, как сделать правильно?
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
Ты не сможешь это сделать одним регулярным выражением.
 

alexhemp

Новичок
Solid

Я тебе написал как сделать правильно. Примерный алгоритм - бери мануал - и разбирайся. Код тебе писать готовый никто не будет.
 

Solid

Drosera anglica
varan: мне почему то кажется обратное.
alexhemp: эх... на всякие вопросы "как открыть файл для чтения" отвечаете, а что б ответить на дельный вопрос, что б человек понял раз и навсегда, как пользоваться регулярками - вам не в могу. Спасибо, спасибо. Всё понял.
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
alexhemp дело говорит. Так всегда и делается в подобных случаях. Только я бы заменял не на 0x01, так как такое в хтмл может встретиться, а на md5($tag_str."какая_нибудь_добавка"); Но это мелочи, конечно же.
 
Сверху