【问题标题】:Warnings in Regular Expression with Posix Collating Elements带有 Posix 整理元素的正则表达式中的警告
【发布时间】:2015-06-23 11:13:15
【问题描述】:

我正在尝试在 php 中运行以下基于正则表达式的函数,最终返回输出。

function vg_excerpt_more( $output ) {

    $string = $output;

    $pattern_auto_excerpt = '#([...]</p>)$#';
    $pattern_manual_excerpt = '#(</p>)$#';

    $replacement = ' <a href="'.get_permalink().'">[Continue...]</a></p>';

    if ( preg_match( $pattern_auto_excerpt, $string ) ) {

        $pattern = $pattern_auto_excerpt;

    } else if ( preg_match( $pattern_manual_excerpt, $string ) ) {

        $pattern = $pattern_manual_excerpt;

    }   

    $output = preg_replace( $pattern, $replacement, $string );

    return $output;

}
add_filter( 'the_excerpt', 'vg_excerpt_more' );
add_filter( 'excerpt_more', 'vg_excerpt_more' );

嗯,字符串可以以[...]&lt;/p&gt;&lt;/p&gt; 结尾,所以我必须检查这两种情况。

问题是,它抛出警告为 -

警告:PREG_MATCH():编译失败:POSIX 排序元素 在 - 'preg_match( $pattern_auto_excerpt, $string)'

警告:PREG_REPLACE(): EMPTY REGULAR EXPRESSION in - '$output = preg_replace($pattern, $replacement, $string);'

编辑:

在@user1852180 的有用回复之后,我继续前进并做到了 -

function vg_excerpt_more( $output ) {


    $string = $output;

    $pattern = '';

    // $pattern_auto_excerpt = '#(\[...\]</p>)$#';

    $pattern_auto_excerpt = '#(\[(?:\.|…)+\])#';
    $pattern_manual_excerpt = '#(</p>)$#';

    $replacement = ' <a href="'.get_permalink().'">[Continue...]</a></p>';

    if ( preg_match( $pattern_auto_excerpt, $string ) ) {

        $pattern = '#(\[(?:\.|…)+\]</p>)$#';

        if ( preg_match( $pattern, $string ) ) {
            return preg_replace( $pattern, $replacement, $string ) . "Dummy2";
        }

    } else if ( preg_match( $pattern_manual_excerpt, $string ) ) {

        $pattern = $pattern_manual_excerpt;
        return preg_replace( $pattern, $replacement, $string ) . "Dummy";

    }

    return $output;

}
add_filter( 'the_excerpt', 'vg_excerpt_more' );
add_filter( 'excerpt_more', 'vg_excerpt_more' );

但我仍然在前端看到 [...] 以及替换。

附言。它也从不打印“Dummy2”,总是“Dummy”。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    您需要转义第一个模式中的括号和点:

    $pattern_auto_excerpt = '#(\[(?:\.|…)+\]</p>)$#';
    

    你不需要使用 if/else 来检查它是否有 [...],让正则表达式用问号检查:

    function vg_excerpt_more( $output ) {
    
        $pattern = '#(?:\[(?:\.|…)+\])?</p>$#';
        $replacement = ' <a href="'.get_permalink().'">[Continue...]</a></p>';
    
        return preg_replace( $pattern, $replacement, $output );
    
    }
    

    【讨论】:

    • 感谢您的回复。就我而言,字符串可以以[..]&lt;/p&gt; 结尾,也可以仅以&lt;/p&gt; 结尾。对不起,我也编辑了主要问题。您的代码会检查这两种情况吗?
    • 我的第一个代码应该通过转义括号来修复您的警告。我的第二个代码是一个较小代码的示例,通过在正则表达式模式中使用问号来执行与您的相同的操作,因此它适用于以 [...] 结尾且仅 .
    • 谢谢。但经过测试,我看到 [...] 仍然与替换一起显示。
    • 我看到一些 WordPress 使用省略号(三点标点符号:)。您可以尝试在正则表达式模式中将\[...\] 替换为\[(?:\.|…)+\],它将匹配省略号和三个点。
    • 在使用字符串 [...]&lt;/p&gt; 测试您的新代码时,我得到了 Dummy2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-05
    • 2013-02-28
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多