1

Есть такой текст:

$text = "AAAA text
<h1>aaa</h1>
Любой текст 
[mt5]({is_hedged})[/mt5] Любой текст [mt5]({is_hedged})[/mt5]
BBBtext
AAAA text
[mt5]({is_hedged})[/mt5] 
Любой текст 
BBBtext";

Хочу удалить все такие строки [mt5]({is_hedged})[/mt5]по этому выражению:

$text = preg_replace('#[mt5].*[/mt5]#s', '', $text);
echo($text);

Бесполезно.Удаляет между первым [mt5] и вторым [/mt5]

Как написать правильно ?

Спасибо !

  • 1
  • 1
    @WiktorStribiżew Это не дубликат потому что вопрос как удалить,заменить а не найти.Впредь читайте внимательней вопросы а потом минусуйте, или отмечайте дубликатами. – Vanya Avchyan Jun 06 '17 at 09:31
  • 2
    Это дубликат, потому что решение - ленивая версия квантификатора (.* => .*?). И всё решится само собой. Таких вопросов миллион по всей сети. – Wiktor Stribiżew Jun 06 '17 at 09:31
  • 1
    @WiktorStribiżew Если я ту регулярку помещу в свою preg_replace , интересно решится ли мой вопрос ,или вы не вдаетесь в подробности ? – Vanya Avchyan Jun 06 '17 at 09:33
  • 1
    @WiktorStribiżew Раз вы уже поняли что ошиблись то пожалуйста отмените свой минус.Все мы ошибаемся,.Нет там ничего постыдного.Стыдно тогда когда не хотим исправить ее – Vanya Avchyan Jun 06 '17 at 09:51
  • 2
    @WiktorStribiżew Не знаю, может это и дупликат, но если не знать, в чём дело, тот вопрос едва ли получится найти. Это и объясняет «миллион вопросов». И в самой первой версии ещё были неэкранированные скобки. – pocketgulag Jun 06 '17 at 09:56

5 Answers5

3

Экранировать квадратные скобки и сделать ленивый квантификатор.

$text = preg_replace('#\[mt5\].*?\[/mt5\]#s', '', $text);
  • Упс не заработало регулярка))). Можете здесь тестировать http://regexr.com/ – Raz Galstyan Jun 06 '17 at 08:34
  • @RazmikGalstyan наверное из-за того, что там регулярные выражения внутри /, а не #? – pocketgulag Jun 06 '17 at 08:39
  • @RazmikGalstyan, упс, а у меня вот эта регулярка отлично работает в отличии от вашей. – Visman Jun 06 '17 at 08:40
  • @Visman точно скопируйте и посмотрите работает или синтаксис не правильный? – Raz Galstyan Jun 06 '17 at 08:41
  • @Visman Здесь проверьте http://regexr.com/ – Raz Galstyan Jun 06 '17 at 08:41
  • @Visman Здесь синтаксическая ошибка '#\[mt5\].*?\[/mt5\]#s' – Raz Galstyan Jun 06 '17 at 08:43
  • 2
    @RazmikGalstyan, покажите мне эту синтаксическую ошибку. Я вижу правильное регулярное выражение. – Visman Jun 06 '17 at 08:48
  • @Visman Вот смотрите на скриншот, не знаю какая у вас версия PHP но оно точно везде не будет работать. линк - https://ibb.co/ffKjtF – Raz Galstyan Jun 06 '17 at 08:55
  • 2
    @RazmikGalstyan в моём регулярном выражении и в вашем используются разные разделители – pocketgulag Jun 06 '17 at 08:59
  • @pocketgulag Разделители не как не влияют на правильный синтаксис написания регулярки, можете еще раз посмотреть скриншот. – Raz Galstyan Jun 06 '17 at 09:02
  • @RazmikGalstyan цитирую из документации по ссылке выше: «Если необходимо использовать разделитель внутри шаблона, его нужно проэкранировать с помощью обратной косой черты». А если используется не разделитель (и не другой специальный символ), то его не нужно экранировать, очевидно. – pocketgulag Jun 06 '17 at 09:06
  • Пожалуйста помогите восстановить правду: Мой вопрос безосновательно помечен дупликатом и минусован. Ту ссылку которая приводится в качестве доказательства не решает мою проблему + это по сути другой вопрос,о выборке а не удаление или замене. Спасибо ! – Vanya Avchyan Jun 06 '17 at 09:45
  • @pocketgulag А это по твоему работающая ? смотри на скриншот - https://ibb.co/dYk7DF – Raz Galstyan Jun 06 '17 at 10:20
  • @RazmikGalstyan второй блок не совпадает, так как нет модификатора g. Думаю, захватывать всё до последнего закрывающего элемента нет необходимости, но все равно, наверное, такое выражение: /\[mt5\].*?\[\/mt5\](?=(?:(?!\[\/mt5\]).)*(?:\[mt5\]|$))/gm сможет это сделать. В вашем же выражении нельзя использовать символ [ внутри блока. – pocketgulag Jun 06 '17 at 10:59
  • @pocketgulag Я не помнил но так как сказал Visman модификатор g нет в PHP – Raz Galstyan Jun 06 '17 at 11:21
  • @pocketgulag А взять до последнего [/mt5] необходимо – Raz Galstyan Jun 06 '17 at 11:22
2

Квадратные скобки нужно экранировать

gimntut
  • 588
  • 1
    Где вы в вопросе увидели не экранированные скобки? – Visman Jun 06 '17 at 08:35
  • Не рабочий вариант,извините – Vanya Avchyan Jun 06 '17 at 08:43
  • 1
    @Visman, в первой редакции, например :-) – Grundy Jun 06 '17 at 13:20
  • 1
    @Visman, т. е. в принятом ответе тебя они не смущают? – Qwertiy Jun 06 '17 at 13:40
  • @Qwertiy, 1. я уже заметил первую правку до вашего комментария и удалил свой вопрос на мете (тоже до вашего комментария). 2. Принятый ответ дан после первой правки, когда скобки были экранированы. 3. ГЛАВНОЕ. Автор в вопросе ясно пишет Удаляет между первым [mt5] и вторым [/mt5], то есть регулярка у него работала изначально, но не верно. Отсюда делаю вывод: не экранированные скобки в его вопросе это описка. – Visman Jun 06 '17 at 13:46
2

Замените жадное .* на ленивое .*?.

Visman
  • 16,518
  • 8
  • 26
  • 56
1
preg_replace('/\[mt5\].*\[\/mt5\]/', '', $text);

UPD

В случае если паттерн встречается в одной строке:

preg_replace('/\[mt5\].*?\[\/mt5\]/', '', $text);
ordman
  • 3,294
  • ..... [mt5]({is_hedged})[/mt5] aklshdjdhfjkasdhf [mt5]({is_hedged})[/mt5].... когда встречаются на одной строке то удаляет неправильно – Vanya Avchyan Jun 06 '17 at 08:32
  • Замените жадное .* на ленивое .*? как советует @Visman – ordman Jun 06 '17 at 08:34
  • @Dmitry OnGamer А если текст будет таким то что сделает ваша регулярка? [mt5] ({is_hedged})[/mt5] сдфдсфдсфдсфдсф [mt5] ({is_hedged})[/mt5] – Raz Galstyan Jun 06 '17 at 08:36
  • Второй пример подходит с s в конце.Потому Что без s каждая строка обрабатывается отдельно – Vanya Avchyan Jun 06 '17 at 08:41
0

Можешь сделать так:))))

$text = preg_replace('#(\[mt5\])([^\[]*)(\[\/mt5\])#', '', $text);
echo($text);
Raz Galstyan
  • 8,258
  • Тоже рабочий вариант ,но к сожалению запоздалый – Vanya Avchyan Jun 06 '17 at 08:46
  • @VanyaAvchyan Да конечно, но как то не понятно вот с этой, как работает если в нем и ошибка есть? '#\[mt5\].*?\[/mt5\]#s' – Raz Galstyan Jun 06 '17 at 08:47
  • @VanyaAvchyan, этот вариант перестает быть рабочим, если у вас между нужными тегами встретится квадратная скобка. – Visman Jun 06 '17 at 08:50
  • @Visman А вот мой вариант когда между нужными тегами квадратная скобка - link - https://ibb.co/kVcXfv – Raz Galstyan Jun 06 '17 at 09:00
  • 1
    @RazmikGalstyan, кривая работа вашей регулярки https://regex101.com/r/TLOzFi/1 + в preg_replace() нет флага g. – Visman Jun 06 '17 at 09:05
  • @Visman правильно, это не учел, поправлю ответ. – Raz Galstyan Jun 06 '17 at 10:21