求助:如何正确移除文章标题中的分类名?含撇号场景失效问题
问题解决:带撇号的分类名无法从文章标题中移除
问题原因
你的代码中使用了\b单词边界匹配分类名,但\b仅在单词字符(字母、数字、下划线)与非单词字符的分界处生效。当分类名包含撇号(')这类非单词字符时,\b会将分类名拆分成多个片段,导致正则无法匹配到完整的分类名,因此无法正确移除。
修复方案
把正则中的\b单词边界替换为负向断言(?<!\w)和(?!\w),它们能确保匹配的分类名前后不是单词字符,不受撇号等非单词字符的影响。同时,为避免替换后出现多余空格,可对结果做空格清理。
修改后的完整代码:
<?php $category = get_queried_object(); if ($category) { $category_name = $category->name; // 获取当前分类名称 $category_id = $category->term_id; $query = new WP_Query(array( 'cat' => $category_id, 'tag_id' => 11, // 显示带有标签ID 11的文章 'posts_per_page' => 10 )); if ($query->have_posts()) { echo '<ul>'; while ($query->have_posts()) { $query->the_post(); $post_title = get_the_title(); // 转义分类名中的正则特殊字符 $escaped_category_name = preg_quote($category_name, '/'); // 使用负向断言替代\b,适配含撇号的分类名 $title_without_category = preg_replace('/(?<!\w)' . $escaped_category_name . '(?!\w)/i', '', $post_title); // 清理多余空格(去除首尾空格+合并中间多个空格为一个) $title_without_category = preg_replace('/\s+/', ' ', trim($title_without_category)); echo '<li><a href="' . get_permalink() . '" style="text-decoration: none;">' . $title_without_category . '</a> </li>'; } echo '</ul>'; } else { echo '<p class="noposts" style="padding-left: 2em;">No posts found for ' . $category_name . '. If you have any suggestions, please let us know.</p>'; } wp_reset_postdata(); } ?>
关键修改说明
- 替换正则边界:
/(?<!\w)...(?!\w)/i确保分类名前后不是单词字符,完整匹配带撇号的分类名 - 空格清理:通过
trim()和preg_replace处理替换后可能出现的多余空格,保证标题格式整洁
内容的提问来源于stack exchange,提问作者Sekiroweb
相关产品推荐
相关产品推荐

