preg_match匹配含连字符hashtag问题:链接生成时连字符被截断
修复话题标签(Hashtag)连字符匹配截断问题
问题根源在正则匹配规则:当前代码里的\w元字符仅匹配字母、数字和下划线,不包含连字符,所以#something-else会被截断匹配成something,导致生成的链接参数缺失后半段。
解决方法
修改正则表达式,把匹配字符集从\w+替换为[\w-]+,这样就能同时匹配字母、数字、下划线和连字符:
function hashtag_links( $content ) { $content = ' '.$content; // 调整正则,新增连字符匹配规则 preg_match_all( '/ #([\w-]+)/u', $content, $matches, PREG_SET_ORDER, 0); if ( isset( $matches[0] ) && is_array( $matches[0] ) ) { foreach ( $matches as $match ) { $link = '<strong onclick="window.location.assign(\'' . add_query_arg( 'hashtag', $match[1], um_get_core_page( 'activity' ) ) . '\'); return false;" class="um-link">#'.$match[1].'</strong>'; $content = str_replace( '#' . $match[1], $link, $content ); } } return $content; }
扩展提示
如果需要支持更多特殊字符(比如点号),可以继续扩展字符集,例如改成[\w\-.]+。注意连字符要放在字符集的开头或结尾,避免被识别为范围符号。
内容的提问来源于stack exchange,提问作者Stephen Copley
相关产品推荐
相关产品推荐

