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

Stierus

Новичок
Регулярные выражения

Здравствуйте. Мне необходимо пройтись по всему тексту и заменить все вхождения подстроки (для примера "test" ) в этом тексте на новую подстроку (допустим "!test!"). Всё было бы отлично, но мне необходимо заменять только отдельные слова ( например подстрока testing не должна меняться на !test!ing ) , так же при замене должны выполняться условия : найденая подстрока не должна быть частью ссылки (<a href=""> some text test<a/> должно игнорироваться) инайденая строка не должна быть внутри тега (<img alt="test"> так же должно игнорироваться) .

делается это для реализации глоссария, который будет парсить текст и подставлять ссылки на известные документы, упоминаемые в тексте.

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

Deserved

Новичок
Вообщем при помощи preg_split попробывать разбить, при помощи preg_match сделать кучу логических проверок и если условия хороши preg_replace.
 

Stierus

Новичок
задача решена, chown, спасибо за ссылку хоть и не пригодилась
 

iSlayter

Новичок
Здесь обычно пишут каким именно образом была решена задача. Пример кода так же в подобных случаях обычно вставляют в тред. ;)
 

Stierus

Новичок
Добавил ещё одно постусловие на отсутствие закрытия тега ( раньше пытался найти открытие тега - это не получилось из-за фиксированости длины анализируемой пред-строки, у постусловий такого ограничения нет ) ... всё оказалось не сложно, просто надо было немног отвлечься от начального замысла :)
 

claygod

Новичок
Подобная задача: необходимо в переменной $a проверить, имеется ли в ней окончание $b (например для слова супермен условие выполнится, если $b="мен")

preg_match("$b$",$a)
- огадываюсь, что переменную в регулярке надо заэкранировать, но не знаю как. Подскажите.
 

claygod

Новичок
if (strpos($a,"/[а-я]b$")==true)...

так не получается вычислить, содержит ли строку

решил путём добавления пробела и в концы переменных, однако, думаю, некрасивое решение
 

stillwaiting

Новичок
2claygod

$a = 'Супермен';
$b = 'мен';

if (stripos($a, $b) === strlen($a) - strlen($b))
echo 'Suxe$!';

у меня работает
 
Сверху