2016-08-30 2 views
-1

Мне нужно заменить теги html, расположенные между скобками. Следующий мой код. Любая помощь будет оценена по достоинству.Regex для замены тегов html между скобками

$string = '<table><tr>Hello{<strong><br/>name<br/></strong>}</tr></table>'; 
echo preg_replace("/\{<.*?>\}/","",$string); 

Обязательный выход

<table><tr>Hello name</tr></table> 
+0

Ну, это не сработает. у вас есть '{SPACE <', и ваше регулярное выражение не позволяет это пространство ... –

+0

пространство не требуется – DevOps

+0

, конечно, нет, поэтому ваше регулярное выражение ничего не соответствует. вы буквально говорите «найдите' {', за которым следует' <', и это НЕ существует в вашем примере текста. ваш текст '{' сопровождается пробелом, за которым следует '<'. –

ответ

2

Вы не можете сделать это с помощью простого регулярного выражения в одиночку, но вы можете использовать регулярные выражения, чтобы найти 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-теги. Это предопределенная функция и должна использоваться вместо того, чтобы изобретать колесо.

регулярное выражение строится следующим образом:

  1. матч начинается с { и заканчивается }; нам нужно убежать от него, поэтому мы используем \{ ... \}.
  2. Мы хотим, чтобы обрабатывать все, но окружающая { и }, поэтому мы помещаем круглый paranthesis внутри: \{( ... )\}, а затем получите все содержимое внутри фигурных скобок, как $ матч [1] без дальнейшей необходимости удалить эти фигурные скобки, используя другие строковые функции.
  3. Мы хотим разрешить все символы между { и }, за исключением самого }; мы используем [^\}], который соответствует всем типам персонажа, но }; и мы хотим, чтобы несколько из них, в результате чего: [^\}]*

Примечание: .* жаден. Итак, если мы просто используем .* вместо [^\}]*, мы получим странные результаты в случае, если есть несколько блоков фигурных скобок. Матч начнется с первого открытия { и закончится последним } в строке и будет содержать все блоки и все, что между ним. Это будет выглядеть так: «Текст {in first} something between {and second one}. И еще несколько». - Но мы хотим, чтобы это было так: «Текст {in first} что-то между {and second one}. И еще несколько.», Правильно?

+0

Это работает ... очень спасибо тонну. – DevOps

+0

@Stefan K. хорошо сказано. – Manish

2

@Diksha Попробуйте это:

$string = '<table><tr><td>Hello {<strong><br/>name<br/></strong>}</td></tr></table>'; 


echo $str = preg_replace_callback("/\{<.*?>\}/", function($m){ 
    return preg_replace('/\{|\}/',"",strip_tags($m[0])); 
}, $string); 
+0

It работы .. thnks – DevOps

+0

Также хорошая работа здесь, Маниш. Было немного быстрее и все объясняло. Продолжайте! (upvote) – SDwarfs

Смежные вопросы