如何替换后跟数字的主题标签?

时间:2018-05-01 12:18:06

标签: php regex preg-replace str-replace

我想替换为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 :(得分:3)

有很多方法可以做到这一点 例如,您可以使用此正则表达式:#\d+

因此:

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

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

}

答案 1 :(得分:0)

只有一种合理的方法 - 使用preg_replace () - 并且您不需要进行条件检查。如果数字前面有一个#标签符号,则将进行替换(如果可能,将进行多次)。如果模式不匹配,则输入字符串保持不变。

在模式中,我使用波浪线作为模式分隔符。 #不需要转义为字面意义。 \d表示任何数字字符(0到9)。 +表示任意数字出现一次或多次。

实际上,将替换以下子字符串:#1#3098426893219#04。匹配可以在字符串中的任何位置找到。

代码:(Demo

$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);
}