Строка: это текст: стена:: стена:: стена:: стена: больше текста
Выход должен быть: это текст: стена: больше текста
Задача: уменьшить слово: стена: только 1.
Я пробовал эти обе идеи, но не работал:
$post_message = preg_replace("/([\:wall:])+/", "\\1", $post_message);
$post_message = preg_replace('/:wall:/', '', $post_message, 1);
Используйте приведенное ниже выражение в функции preg_replace
.
Regex:
(:wall:)(?:\s+:wall:)+
ИЛИ
(:wall:)(?:\s+\1)+
Заменяемая строка:
$1
Код:
<?php
$str = "this is text :wall: :wall: :wall: :wall: more text";
echo preg_replace('~(:wall:)(?:\s+\1)+~', '$1', $str);
?>
Вывод:
this is text :wall: more text
(:wall:)
Снимает текст :wall:
в группу. Это можно отнести к индексу группы 1. Таким образом, это (?:\s+\1)+
соответствует следующему одному или нескольким пробелам + :wall:
строки. Замена совпадения символами внутри группового индекса 1 приведет к удалению всех дубликатов :wall:
strings.
$str = 'this is text :wall: :wall: :wall: :wall: more text';
$post_message = preg_replace("#(:wall:\s+)+#i", '\1', $str);
Согласно первому решению:
Мне нужно:
String1: это текст: (:( :( больше текста
String2: это текст:? :? :? больше текста
Результат должен быть: это текст: (больше текста
Результат должен быть: это текст:? больше текста
Задача: уменьшить смайлик :( только до 1.
Задача: уменьшить смайлик:? только 1.
Я пробовал их, но не работал:
$post_message = preg_replace('~(:()(?:\s+\1)+~', '$1', $post_message);
$post_message = preg_replace('~(:?)(?:\s+\1)+~', '$1', $post_message);
Еще раз спасибо.
"(:wall:)(?:\s+:wall:)+"
, это будет"~(:wall:)(?:\s+:wall:)+~"