Как заменить хэштегом на число? - PullRequest
0 голосов
/ 01 мая 2018

Я хочу заменить на FALSE, где строка содержит #, за которым следует целое число.

Это мой код:

$newlogicexpression = '#1 and (1743327.12 >  10)';
if( strpos( $newlogicexpression, '#' ) !== false ) {
    $newlogicexpression = str_replace('#', 'FALSE', $newlogicexpression);
    $this->logger->debug($newlogicexpression);
}

Мой ожидаемый результат: FALSE and (1743327.12 > 10)

Мой текущий выход: FALSE1 and (1743327.12 > 10)

Исходя из метода post, целое число, следующее за #, может отличаться.

Замена должна происходить в любой позиции строки.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Есть только один разумный способ сделать это - с preg_replace () - и вам не нужна проверка состояния. Если перед номером стоит символ хэштега, будет произведена замена (если возможно, несколько раз). Если шаблон ничего не соответствует, то входная строка остается неизменной.

В шаблоне я использую тильды для разделителей шаблонов. # не нужно экранировать буквально. \d означает любой символ цифры (от 0 до 9). + означает одно или несколько вхождений любой цифры.

По сути, будут заменены следующие подстроки: #1, #3098426893219 и #04. Совпадения можно найти в любом месте строки.

Код: ( Демо )

$newlogicexpression = '#1 and (1743327.12 >  10)';
echo preg_replace('~#\d+~', 'FALSE', $newlogicexpression);

Выход:

FALSE  and (1743327.12 >  10)

Обновление на 2018-12-08:

Я не совсем уверен, почему сегодня я потерял upvote без объяснения причин, но если вы хотите вызвать $this->logger->debug($newlogicexpression); только при замене, вы можете использовать это (все еще только один вызов функции):

$newlogicexpression = '#1 and (1743327.12 >  10)';
$newlogicexpression = preg_replace('~#\d+~', 'FALSE', $newlogicexpression, 1, $count);  // only 1 replace permitted, otherwise use -1
if ($count) {
    $this->logger->debug($newlogicexpression);
}
0 голосов
/ 01 мая 2018

Есть много способов сделать это.
Например, вы можете использовать это регулярное выражение: #\d+

Таким образом:

$newlogicexpression = '#1 and (1743327.12 >  10) and #2';
if( strpos( $newlogicexpression, '#' ) !== false ) {

    $newlogicexpression = preg_replace('/#\d+/', 'FALSE', $newlogicexpression);
    $this->logger->debug($newlogicexpression);

}
...