Вы, вероятно, могли бы использовать greed killer ?
в своем выражении кода (дополнительная информация здесь: Соответствие текста между разделителями: жадное или ленивое регулярное выражение? ), поэтому, если у вас есть код, подобный этому:
<code>foo</code> another <code>bar</code>
Он будет соответствовать просто foo
и bar
, а не foo
другому bar
, также вы должны использовать preg_match_all()
(с флагом PREG_OFFSET_CAPTURE
) и написать свой собственный анализатор. Или, скорее, используйте preg_replace_callback()
так:
// Just strtolower example (this would do formatting)
function myCallback( $matches){
return strlower( $matches[2]);
}
$string = preg_replace_callback("/(<code>).*?(<\/code>)/si", 'myCallback', $string)
Обратите внимание на знак вопроса в .*?
. Вам также следует использовать модификаторы s
и i
, чтобы ваш код работал с такими кодами:
lorem ipsum <code>
foo
</code> bar
Если вам нужна проверка, вы можете использовать это:
$string = preg_replace("/(<code>).*?(<\/code>)/si", '', $string);
if( (strpos( $string, '<code') !== false) || (strpos( $string, '</code') !== false){
echo 'Invalid code';
}