使用Posix整理元素的正则表达式中的警告

时间:2015-06-23 11:13:15

标签: php regex

我正在尝试在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' );

好吧,字符串可能以[...]</p></p>结尾,所以我必须检查这两种情况。

问题是,它正在发出警告 -

  

警告:PREG_MATCH():COMPILATION FAILED:POSIX COLLATING ELEMENTS   不支持OFFSET 1 - &#39; preg_match($ pattern_auto_excerpt,   $ string)&#39;

  

警告:PREG_REPLACE():EMPTY常规表达式 - &#39; $ output =   preg_replace($ pattern,$ replacement,$ string);&#39;

编辑:

在@ 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' );

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

PS。它也永远不会打印&#39; Dummy2&#39;永远&#39; Dummy&#39;。

1 个答案:

答案 0 :(得分: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 );

}