regex 使用preg_replace链接DOI

5n0oy7gb  于 2023-08-08  发布在  其他
关注(0)|答案(3)|浏览(97)

我在循环浏览一些有参考文献的文本。其中一些是DOI编号,我需要将它们链接起来。
示例文本:

<div>Interesting article here:  doi:10.1203/00006450-199305000-00005</div>

字符串
到目前为止我尝试过的:

$html = preg_replace("\b(10[.][0-9]{4,}(?:[.][0-9]+)*/(?:(?![\"&\'<>])[[:graph:]])+)\b", "<a href='https://doi.org/\\0' target='_new'>doi:\\0</a>",$html);


这将返回一个空字符串。
我期待:

<div>Interesting article here:  <a href='https://doi.org/10.1203/00006450-199305000-00005' target='_new'>doi:10.1203/00006450-199305000-00005</a></div>


我哪里做错了?

编辑2018-01-30:根据Katrin的以下回答更新DOI解析器。

8ljdwjyq

8ljdwjyq1#

CrossRef has a recommendation,他们在99.3%的DOI上成功测试:

/^10.\d{4,9}/[-._;()/:A-Z0-9]+$/i

字符串
此外,新推荐的解析器位于https://doi.org/

syqv5f0l

syqv5f0l2#

我改变了CrossRef recommendation pattern的推荐模式,然后在我的Laravel项目中使用这个函数:

function is_valid_doi($doi)
{
    return preg_match('/^((http(s)?:\/\/)?(dx.)?doi.org\/)?10.\d{4,9}\/[-._;()\/:A-Z\d]+$/i', $doi);
}

字符串
希望能帮到你。

xa9qqrwz

xa9qqrwz3#

使用Regular Expression Test Tool,我找到了一个适用于我的示例文本的expression

$pattern        = '(10[.][0-9]{4,}[^\s"/<>]*/[^\s"<>]+)';
$replacement    = "<a href='http://dx.doi.org/$0' target='1'>doi:$0</a>";
$html = preg_replace($pattern, $replacement, $html);

字符串
高温高压

相关问题