Ваша строка ввода (незначительно отредактирована для уточнения моего ответа):
$string = "Just simply put
<code>
<p>encoded code</p>
</code>
and this <b>bold</b> text will be bold,
because it isn't inside <code><b>code tags</b></code>";
Шаг 1:
Разбейте вашу строку на части, окруженные <code>
. Обратите внимание, что ваше регулярное выражение должно использовать #
, а не /
в качестве разделителей, поэтому вам не нужно заботиться о /
в вашем
.
preg_match_all("#<code>(.*?)</code>#is", $string, $codes);
Обратите внимание на s
в конце REGEX для игнорирования разрывов строк в группе (*)
.
Приведенный выше код является ленивым (см. Ссылки внизу) и также не будет соответствовать неполным тегам (например, <code>
без соответствующих
).
Шаг 2:
Внесите необходимые изменения в HTML для каждой из найденных подстрок (вы должны быть знакомы с тем, как preg_match_all
возвращает данные из функции, см. Ссылку внизу):
$replace = [];
foreach($codes[1] as $key=>$codeBlock ){
$replace[$key] = htmlentities($codeBlock, ENT_QUOTES, "UTF-8", false);
}
unset($key, $codeBlock);
Шаг 3:
Примените изменения к исходным значениям (тезисы НЕ совпадают с преобразованными значениями, использованными на шаге 2):
foreach($codes[0] as $key=>$replacer){
$string = str_replace($replacer, $replace[$key], $string);
}
unset($key, $replacer, $replace);
Выход:
Выше будет выведено:
Просто введите
кодированный код
и этот полужирный текст будет полужирным, потому что он не внутри кодовых тегов
У вас должно быть знакомое понимание preg_match _ * семейства функций PHP, а также общих PCRE REGEX .
Пожалуйста, также прочитайте это здесь , и здесь и прочитайте это и особенно это .
Приветствия