Заменить специфический символ только между <тегом> и </ тегом> в PHP

У меня есть что-то вроде <code> <1> <2> </code> и я хотел бы получить следующее: <code> &lt;1&gt; &lt;2&gt; </code> <code> &lt;1&gt; &lt;2&gt; </code> <code> &lt;1&gt; &lt;2&gt; </code> но я хочу применить это только внутри тегов <code></code> а не где-либо еще.

У меня уже есть это:

 $txt = $this->input->post('field'); $patterns = array( "other stuff to find", "/<code>.*(<).*<\/code>/m" ); $replacements = array( "other stuff to replace", "&lt;" ); $records = preg_replace($patterns,$replacements, $txt); 

Он успешно заменяет символ, но удаляет окруженные теги <code></code>

Любая помощь будет очень оценена! благодаря

Другая возможность, используя функцию обратного вызова:

 <?php $test = "<code> <1> <2></code> some other text <code> other code <1> <2></code>"; $text = preg_replace_callback("#<code>(.*?)</code>#s",'replaceInCode',$test); echo htmlspecialchars($test."<br />".$text); function replaceInCode($row){ $replace = array('<' => '&lt','>' => '&gt'); $text=str_replace(array_keys($replace),array_values($replace),$row[1]); return "<code>$text</code>"; } 

Нелегко (не уверен, даже если возможно) выполнить это без второй функции, так как может быть несколько <символов внутри блока.

Подробнее здесь: http://php.net/preg_replace_callback

Вы можете сделать это с помощью регулярного выражения, но не за один раз. Я предлагаю вам разобраться с вашими другими заменами отдельно. Нижеприведенный код позаботится о псевдотегах в разделах <code>:

 $source = '<code> <1> <2> </code>'; if ( preg_match_all( '%<code>(.*?<.*?)</code>%s', $source, $code_sections ) ) { $modified_code_sections = preg_replace( '/<([^<]+)>/', "&lt;$1&gt;", $code_sections[1] ); array_walk( $modified_code_sections, function ( &$content ) { $content = "<code>$content</code>"; } ); $source_modified = str_replace( $code_sections[0], $modified_code_sections, $source ); } echo $source_modified;