У меня есть что-то вроде <code> <1> <2> </code>
и я хотел бы получить следующее: <code> <1> <2> </code>
<code> <1> <2> </code>
<code> <1> <2> </code>
но я хочу применить это только внутри тегов <code></code>
а не где-либо еще.
У меня уже есть это:
$txt = $this->input->post('field'); $patterns = array( "other stuff to find", "/<code>.*(<).*<\/code>/m" ); $replacements = array( "other stuff to replace", "<" ); $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('<' => '<','>' => '>'); $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( '/<([^<]+)>/', "<$1>", $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;