Нижеприведенный сценарий берет блок $ myContent и выполняет функцию doReplace () в значении $ myKeyword. Проблема заключается в том, что она не знает, находится ли текст замены внутри тега или нет.
Мне нужно изменить функцию doReplace (), чтобы она не касалась текста внутри или в качестве атрибутов названных тегов (h1, h2, h3, i, u, b, strong, em, img).
Я думаю, было бы лучше преобразовать это в метод xPath и искать предложения о том, как это можно сделать с помощью xPath. Итак, вопрос: «Как бы вы преобразовали это в xPath»?
Примечание. Переменная count в функции replace существует, потому что я заменяю только три первых появления ключевого слова. В первый раз кажется, что он выделен полужирным шрифтом, в следующий раз, когда он будет выделен курсивом, а в третий раз он появится, он будет подчеркнут.
$myKeyword = "test keyword"; $myContent = "My content contains the "test keyword". Don't do the replace if the test keyword is inside: h1, h2, h3, i, u, b, strong, em, tags. <h1>This test keyword would not be replaced</h1>"; $myContent = preg_replace_callback("/\b($mykeyword)\b/i","doReplace", $myContent); function doReplace($matches) { static $count = 0; switch($count++) { case 0: return ' <b>'.trim($matches[1]).'</b>'; case 1: return ' <em>'.trim($matches[1]).'</em>'; case 2: return ' <u>'.trim($matches[1]).'</u>'; default: return $matches[1]; } }