PHP:正则表达式 preg_replace_callback 匹配 PHP 中的所有数字

发布于 2024-11-18 08:58:13 字数 947 浏览 3 评论 0原文

preg_replace_callback( "/[0-9]*/", array( &$this, '_getPHPNumber' ), $code );

private function _getPHPNumber( $matches ) {
    return ( $this->_getHtmlCode( $matches[0], PHP::$Colors['number'] ) );
}

private function _getHtmlCode( $text, $color ) {
    $rows = array_filter( explode( "\n", $text ) );
    $count = count( $rows );
    $output = '';

    for ( $i = 0; $i < $count; $i++ ) {
        $n = ( $count > 1 ? ( $i != $count - 1 ? "\n" : "" ) : "" );
        $output .= "<span style=\"color:{$color};\">{$rows[$i]}</span>{$n}";

    }

    return ( $output );
}

上面的输出看起来像这样:

<span style="color:#FF0000;">152</span>

它工作得很好,除非数字是 0,它会从输出中删除。导致问题的行是 _getHtmlCode 中的 $rows = array_filter(explode( "\n", $text ) );。确切的原因是array_filter。如果我删除它,我的输出就会完全损坏,但会出现 0。如果我留下它,0 就会被删除。

关于如何解决这个问题有什么想法吗?

preg_replace_callback( "/[0-9]*/", array( &$this, '_getPHPNumber' ), $code );

private function _getPHPNumber( $matches ) {
    return ( $this->_getHtmlCode( $matches[0], PHP::$Colors['number'] ) );
}

private function _getHtmlCode( $text, $color ) {
    $rows = array_filter( explode( "\n", $text ) );
    $count = count( $rows );
    $output = '';

    for ( $i = 0; $i < $count; $i++ ) {
        $n = ( $count > 1 ? ( $i != $count - 1 ? "\n" : "" ) : "" );
        $output .= "<span style=\"color:{$color};\">{$rows[$i]}</span>{$n}";

    }

    return ( $output );
}

The output of the above would look like this:

<span style="color:#FF0000;">152</span>

It works great, except if the number is a 0, it gets removed from output. The line causing the issue is $rows = array_filter( explode( "\n", $text ) ); in the _getHtmlCode. The exact cause is array_filter. If I remove it, my output gets completely broken, but the 0's appear. If I leave it, the 0's get removed.

Any ideas on how to fix this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

眼泪都笑了 2024-11-25 08:58:13

array_filter 的手册页有你的答案

如果没有提供回调,则全部
*输入条目等于 FALSE(参见*
转换为布尔值)将是
*已删除。*

我相信 0 评估为假

我目前无法测试,但我相信这会起作用

$rows = array_filter( explode( "\n", $text ), 'is_string' );

The Man page for array_filter has your answer

If no callback is supplied, all
*entries of input equal to FALSE (see*
converting to boolean) will be
*removed.*

And I believe 0 evaluates to FALSE.

I can't test at the moment but I believe this will work

$rows = array_filter( explode( "\n", $text ), 'is_string' );
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文