我正在提取 RSS 提要并使用 DOMXPath 将所有现有的锚标记转换为自定义标记,出于各种原因,这些标记看起来像这样:
[webserviceLink]{$url}[/webserviceLink][webserviceLinkName]{$text}[/webserviceLinkName]
这很好用,但我也想将所有非 html 文本链接转换为相同的格式,但遇到了一些问题。
这是我用于转换文本链接的代码:
$pattern = '(?xi)(?<![">])\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:\'".,<>?«»“”‘’]))';
$desc = preg_replace_callback("#$pattern#i", function($matches)
{
$input = $matches[0];
$url = preg_match('!^https?://!i', $input) ? $input : "http://$input";
if (strlen($input) > 20 && !strpos($input, " "))
$input = substr($input, 0, 18)."... ";
return "[webserviceLink]{$url}[/webserviceLink][webserviceLinkName]{$input}[/webserviceLinkName]";
}, $desc);
我不确定如何在此正则表达式中执行否定回调,以检查我正在转换的链接是否不在现有的 html 标记(如 img)或我上面的自定义链接标记中。