使用PHP preg_replace提取括号内含-_符号的数字
解决PHP提取括号内特定格式数字的问题
首先,你原来的正则思路有点小问题——直接替换非目标字符会把所有分散的数字、减号、下划线都拼在一起,没法精准定位到括号内的目标内容。咱们换个更精准的方式来实现:
方法1:用preg_match直接匹配目标内容(更直观)
如果只需要提取那一个符合条件的括号内容,用preg_match会更直接,正则专门匹配括号内由数字、-、_组成的内容:
$FolderTitle[$Counter] = "This is 1 example (text) with a (number)(01230_12-3)"; // 正则解释:匹配(开头,捕获里面仅包含数字、-、_的内容,最后是) preg_match('/\(([0-9\-_]+)\)/', $FolderTitle[$Counter], $matches); // 提取捕获组的内容,也就是括号里的目标字符串 $FolderNumber[$Counter] = isset($matches[1]) ? $matches[1] : ''; echo $FolderNumber[$Counter]; // 输出:01230_12-3
方法2:用preg_replace实现(符合你要求的函数)
如果一定要用preg_replace,可以把所有不符合条件的内容都替换为空,只留下目标括号内的内容:
$FolderTitle[$Counter] = "This is 1 example (text) with a (number)(01230_12-3)"; // 正则解释:匹配所有内容,要么保留括号内的目标内容,要么替换为空 $FolderNumber[$Counter] = preg_replace('/.*?\(([0-9\-_]+)\)|.*/', '$1', $FolderTitle[$Counter]); echo $FolderNumber[$Counter]; // 输出:01230_12-3
正则小说明
\(和\):转义括号,因为括号在正则里是特殊语法字符[0-9\-_]+:匹配1个或多个数字、转义后的减号(避免在字符集里被当作范围符号)、下划线- 方法2里的
.*?是非贪婪匹配,确保只匹配到最近的括号,不会把多个括号内容错误连起来
如果你的字符串里有多个符合条件的括号内容,需要提取所有的话,可以用preg_match_all:
preg_match_all('/\(([0-9\-_]+)\)/', $FolderTitle[$Counter], $matches); // $matches[1]就是所有符合条件的括号内内容的数组 print_r($matches[1]);
内容的提问来源于stack exchange,提问作者user451513
相关产品推荐
相关产品推荐

