#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);