Использование preg_replace для ссылки DOI

Я перебираю текст со встроенными ссылками на литературу. Некоторые из них являются номерами 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>

Куда я иду не так?

edit 2018-01-30: обновленный резольвер DOI согласно ответу Кэтрин ниже.

3 ответа

Решение

Используя инструмент тестирования регулярных выражений, я нашел выражение, которое подходит для моего примера текста:

$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);

НТН

У CrossRef есть рекомендация, чтобы они успешно прошли тестирование на 99,3% DOI:

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

Кроме того, новый рекомендуемый преобразователь находится по адресуhttps://doi.org/,

Я изменил рекомендуемый шаблон с шаблона рекомендаций CrossRef , затем использую эту функцию для своего проекта Laravel:

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

надеюсь помочь вам.

Другие вопросы по тегам