Использование 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);
}
надеюсь помочь вам.