如何使用正则表达式匹配替换含字母数字和下划线的ID字符串?
你的代码存在两处核心问题,修正后即可正常运行:
问题分析
- 正则规则不符合要求:
- 你将
+写在了字符组[]内部,会额外匹配加号字符,不符合仅匹配字母、数字、下划线的要求 - 没有强制要求匹配内容必须包含至少1个下划线,导致所有纯字母、纯数字的内容也被命中,这是你出现匹配范围过大的核心原因
- 没有添加单词边界限制,可能出现半截匹配的异常情况
- 你将
- 替换字符串的闭合标签错误:你写的
<\b>是错误语法,正确的粗体闭合标签是</b>
修正后的代码
$description = preg_replace( "~\b(?=[[:alnum:]_]*_)[[:alnum:]_]+\b~", "<b>$0</b>", $description );
规则说明
\b匹配单词边界,确保只匹配独立的完整字符串,不会误匹配其他内容中的字符片段(?=[[:alnum:]_]*_)是正向零宽断言,要求匹配的内容中必须至少存在一个下划线[[:alnum:]_]+匹配一个或多个仅由字母、数字、下划线组成的字符
如果偏好更简洁的写法,PHP中\w默认等价于[[:alnum:]_],可以简化为:
$description = preg_replace( "~\b(?=\w*_)\w+\b~", "<b>$0</b>", $description );
内容的提问来源于stack exchange,提问作者Sting1
相关产品推荐
相关产品推荐

