Вы не можете сделать это с помощью простого регулярного выражения в одиночку, но вы можете использовать регулярные выражения, чтобы найти paranthesis блоки в соответствии с нижеследующими указаниями
function process_paranthesis($match) {
return strip_tags($match[1]);
}
$string = '<table><tr>Hello { <strong>name</strong>}</tr></table>';
echo preg_replace_callback("/\{([^\}]*)\}/", "process_paranthesis",$string);
RegEx был изменен, чтобы просто найти все {...} - блоки, и мы используем preg_replace_callback()
, который вызывает функцию, которая вычисляет строку, в которую должно быть заменено совпадение. Параметр $ match функции обратного вызова содержит информацию о совпадении различными способами. $ match [0] содержит весь текст совпадения, а $ match [1] содержит текст в первой скобке в матче. Функция strip_tags()
затем используется в функции обратного вызова, чтобы удалить все HTML-теги. Это предопределенная функция и должна использоваться вместо того, чтобы изобретать колесо.
регулярное выражение строится следующим образом:
- матч начинается с
{
и заканчивается }
; нам нужно убежать от него, поэтому мы используем \{
... \}
.
- Мы хотим, чтобы обрабатывать все, но окружающая
{
и }
, поэтому мы помещаем круглый paranthesis внутри: \{(
... )\}
, а затем получите все содержимое внутри фигурных скобок, как $ матч [1] без дальнейшей необходимости удалить эти фигурные скобки, используя другие строковые функции.
- Мы хотим разрешить все символы между
{
и }
, за исключением самого }
; мы используем [^\}]
, который соответствует всем типам персонажа, но }
; и мы хотим, чтобы несколько из них, в результате чего: [^\}]*
Примечание: .*
жаден. Итак, если мы просто используем .*
вместо [^\}]*
, мы получим странные результаты в случае, если есть несколько блоков фигурных скобок. Матч начнется с первого открытия {
и закончится последним }
в строке и будет содержать все блоки и все, что между ним. Это будет выглядеть так: «Текст {in first} something between {and second one}
. И еще несколько». - Но мы хотим, чтобы это было так: «Текст {in first}
что-то между {and second one}
. И еще несколько.», Правильно?
Ну, это не сработает. у вас есть '{SPACE <', и ваше регулярное выражение не позволяет это пространство ... –
пространство не требуется – DevOps
, конечно, нет, поэтому ваше регулярное выражение ничего не соответствует. вы буквально говорите «найдите' {', за которым следует' <', и это НЕ существует в вашем примере текста. ваш текст '{' сопровождается пробелом, за которым следует '<'. –