如何更新正则表达式以匹配多种格式的DOI(含链接、特殊字符)
多格式DOI提取的PHP正则解决方案
适配的DOI格式
- 带空格或无空格的DOI标识:
DOI: 10.xxxx...、DOI:10.xxxx... - HTTPS/HTTP链接形式:
https://doi.org/xxxx...、http://dx.doi.org/xxxx... - 包含
&符号的特殊DOI:例如DOI: 11.11111/aaa.111&1111&11
更新后的正则表达式
$pattern = '/(?:DOI: ?|https?:\/\/(?:dx\.)?doi\.org\/)([\w\/.&-]+)(?=\s|$|[,.!?;])/i';
正则说明
(?:DOI: ?|https?:\/\/(?:dx\.)?doi\.org\/):匹配所有可能的DOI前缀,非捕获组避免生成多余匹配结果DOI: ?:兼容带空格或无空格的DOI标识写法https?:\/\/(?:dx\.)?doi\.org\/:匹配HTTP/HTTPS开头的DOI链接,同时兼容dx.doi.org和doi.org两种域名
([\w\/.&-]+):捕获DOI主体部分,允许字母、数字、下划线、斜杠、点、&、连字符,直接覆盖含&的特殊DOI场景(?=\s|$|[,.!?;]):正向预查规则,确保匹配到的DOI在空白、文本结尾或常见标点前停止,避免误捕获无关内容/i:忽略大小写,兼容doi:或Doi:等大小写变体
PHP代码示例
// 示例大文本 $text = "这里是包含多种DOI的测试文本:DOI: 10.1234/abc.567,https://doi.org/10.9876/def.012,DOI:11.11111/aaa.111&1111&11,http://dx.doi.org/10.5555/ghi.345"; // 正则匹配 $pattern = '/(?:DOI: ?|https?:\/\/(?:dx\.)?doi\.org\/)([\w\/.&-]+)(?=\s|$|[,.!?;])/i'; preg_match_all($pattern, $text, $matches); // 提取到的所有DOI主体 $extractedDOIs = $matches[1]; // 输出结果 print_r($extractedDOIs);
运行后会输出所有符合格式的DOI,包括含&的特殊版本。
注意事项
- 如果文本中DOI后无明显分隔符,可适当调整正向预查规则(比如去掉标点限制),但可能会引入少量误匹配
- 若需要保留完整的DOI链接(如
https://doi.org/10.xxx),只需去掉正则中的捕获组,直接匹配整个前缀+主体即可
内容的提问来源于stack exchange,提问作者palka tt
相关产品推荐
相关产品推荐

