Вы можете использовать этот шаблон:
$pattern = '/((<[^>]*>)*)([^s]*)s/';
$replace = '\1\3■'; # ■ = your replacement string
$result = preg_replace( $pattern, $replace, $str );
демонстрационная версия regex101
Объяснение шаблона:
( # group 1:
(<[^>]*>)* # group 2: zero-or-more <...>
)
([^s]*) # group 3: zero-or-more not “s”
s # litterally “s”
Если вы хотите, чтобы совпадение не учитывало регистр, добавьте «i» в конце шаблона:
$pattern = '/((<[^>]*>)*)([^s]*)s/i';
Изменить: объяснение замены
В шаблоне поиска у нас есть 3 группы, окруженные круглыми скобками. В строке замены мы можем ссылаться на группы по синтаксису \1
, где 1
— номер группы.
Итак, заменить строку в примере означает: заменить группу 1 на себя, заменить группу 3 на себя, заменить «s» на желаемую замену. Нам не нужно использовать группу 2, потому что она включена в группу 1 (это из-за невозможности регулярного выражения получить повторяющиеся группы).
В демонстрационной строке:
abs<text size:3>ssss<text size:3><img src="img"><text size:3>absc
└┘╵└───────────┘╵╵╵╵└───────────────────────────────────────┘└┘╵╵
└─┘└────────────┘╵╵╵└──────────────────────────────────────────┘
1 2 345 6
Совпадения с шаблоном:
group 1 group 3 s
--------- --------- ---------
1 > 0 1 1
2 > 1 0 1
3 > 0 0 1
4 > 0 0 1
5 > 0 0 1
6 > 3 1 1
Последняя «с» не совпадает, поэтому не заменяется.
person
fusion3k
schedule
09.03.2016
<
...>
вот так? - person bobble bubble   schedule 09.03.2016