Как в PHP заменить подстроки и исключить из замены некоторые теги? Приветствую Есть HTML, для примера такой (сразу в переменной):$text = ' Lorems ipsum dolor sit amet Loremi ipsum dolor sit amet Loremis ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit amet Lorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit ametLorem ipsum dolor sit amet '; Нужно заменить по регулярке "склонения" слова "Lorem". В тексте их встречается несколько: Lorem, Lorems, Loremi, Loremis. На ум приходит простое решение:$search = '/(\bLore.+?\b)/ui'; $replace = trim('$1'); $text = preg_replace($search, $replace, $text); И, вроде бы, работает, но есть одна проблема — на знаю как исключить замены в тегах заголовков (h1, h2, h3).Вопросы: — корректно ли меняю неполную словоформу? — как исключить замены в тегах заголовков (исключить все что внутри h1, h2, h3)?
Для того чтобы исключить замены внутри тегов заголовков (h1, h2, h3), нужно модифицировать регулярное выражение, чтобы оно не затрагивало содержимое этих тегов.
Для исключения замен внутри тегов h1, h2, h3 можно использовать negative lookahead. Например, так:$search = '/\bLore[^<]*?(?<!<\/h[1-3]>)\b/iu';
Относительно корректности замены неполной словоформы "Lorem" на "Lorem" - это уже зависит от ваших требований. Если вам подходит такое решение, то оно корректно.
Вот как можно изменить ваш код с учетом указанных выше пунктов:$search = '/\bLore[^<]*?(?<!<\/h[1-3]>)\b/iu'; $replace = '$0'; $text = preg_replace($search, $replace, $text);
Для того чтобы исключить замены внутри тегов заголовков (h1, h2, h3), нужно модифицировать регулярное выражение, чтобы оно не затрагивало содержимое этих тегов.
Для исключения замен внутри тегов h1, h2, h3 можно использовать negative lookahead. Например, так:$search = '/\bLore[^<]*?(?<!<\/h[1-3]>)\b/iu';
Относительно корректности замены неполной словоформы "Lorem" на "Lorem" - это уже зависит от ваших требований. Если вам подходит такое решение, то оно корректно.
Вот как можно изменить ваш код с учетом указанных выше пунктов:$search = '/\bLore[^<]*?(?<!<\/h[1-3]>)\b/iu';
$replace = '$0';
$text = preg_replace($search, $replace, $text);