我正在尝试在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;。
答案 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 );
}