Изменить str_replace() в цикле на один вызов preg_replace()?

#php #regex

#php #регулярное выражение

Вопрос:

Как изменить это на preg_replace() эквивалент (без использования цикла)?

Примечание: $text — это utf-8.

   do $text = str_replace("* *", "*", $text, $totRepla); while ($totRepla);
  

Комментарии:

1. Пожалуйста, предоставьте текстовый пример.

2. спасибо за тот, который меняет тему. Я боялся, что Google займет ужасное первое место в рейтинге индексации по трибальному и плохо сформулированному вопросу

Ответ №1:

Я полагаю, что шаблон регулярного выражения для соответствия произвольному long * * * * * * является

 /(* )**/
  

Пожалуйста, добавьте остальной код самостоятельно, у меня сейчас нет PHP под рукой, чтобы предоставить полный фрагмент кода.

Комментарии:

1. спасибо, я буду использовать: /(* ) */ все другие доступные решения, не сводите несколько вариантов к одному.

2. Не могли бы вы сравнить свое первоначальное решение с решением с регулярным выражением? Интересно, какой из них работает быстрее : D

3. Я уверен, что это зависит от того, насколько совпадают последовательные звездочки в $ text. Бьюсь об заклад, регулярное выражение более эффективно (поскольку оно скомпилировано), если во входной строке больше 10. Если вы напишете код, я также запущу его на своем сервере.

Ответ №2:

На самом деле, строковые функции намного эффективнее регулярных выражений, я не вижу причин использовать regex, если у вас есть рабочее решение с использованием str_replace .

http://php.net/manual/en/function.str-replace.php

смотрите документацию:

Если вам не нужны сложные правила замены (например, регулярные выражения), вы всегда должны использовать эту функцию вместо preg_replace().

Комментарии:

1. str_replace() не обязательно более эффективно, если оно используется в do ... while цикле.

Ответ №3:

 preg_replace('/* */', '*', $totRepla);
  

Комментарии:

1. Для этого все равно потребуется цикл while.

Ответ №4:

Эквивалент PCRE этого:

 $text = preg_replace('~(?:[*] ) [*]~', '*', $text);
  

Ваш код предполагает, что вам не интересно знать, сколько произошло замен, поэтому вам не нужна $totRepla переменная. Однако, если я ошибаюсь, это способ получить это количество:

 $text = preg_replace('~(?:[*] ) [*]~', '*', $text, -1, $totRepla);