用PHP字符串中的外部链接替换相对链接

时间:2018-06-27 09:19:21

标签: php regex preg-match preg-match-all

我正在与一个纯粹与文件的内部相对链接配合使用的编辑器一起工作,该链接非常适合我使用的99%的文件。

但是,我还使用它在电子邮件正文中插入了指向文件的链接,而相对链接却不会减少芥末味。

而不是修改编辑器,我想从编辑器中搜索字符串,并将相对链接替换为如下所示的外部链接

替换

files/something.pdf

使用

https://www.someurl.com/files/something.pdf

我提出了以下建议,但我想知道是否有更好/更有效的方法来使用PHP

<?php
$string = '<a href="files/something.pdf">A link</a>, some other text, <a href="files/somethingelse.pdf">A different link</a>';

preg_match_all('/<a[^>]+href=([\'"])(?<href>.+?)\1[^>]*>/i', $string, $result);

if (!empty($result)) {
    // Found a link.
    $baseUrl = 'https://www.someurl.com';
    $newUrls = array();
    $newString = '';

    foreach($result['href'] as $url) {
        $newUrls[] = $baseUrl . '/' . $url;
    }

    $newString = str_replace($result['href'], $newUrls, $string);

    echo $newString;
}
?>

非常感谢

2 个答案:

答案 0 :(得分:0)

您可以简单地使用preg_replace替换所有出现在双引号中的以URL开头的文件:

$string = '<a href="files/something.pdf">A link</a>, some other text, <a href="files/somethingelse.pdf">A different link</a>';

$string = preg_replace('/"(files.*?)"/', '"https://www.someurl.com/$1"', $string);

结果将是:

<a href="https://www.someurl.com/files/something.pdf">A link</a>, some other text, <a href="https://www.someurl.com/files/somethingelse.pdf">A different link</a>

答案 1 :(得分:0)

您确实应该使用DOMdocument来完成这项工作,但是如果您要使用正则表达式,则可以使用它来完成这项工作:

$string = '<a some_attribute href="files/something.pdf" class="abc">A link</a>, some other text, <a class="def" href="files/somethingelse.pdf" attr="xyz">A different link</a>';
$baseUrl = 'https://www.someurl.com';
$newString = preg_replace('/(<a[^>]+href=([\'"]))(.+?)\2/i', "$1$baseUrl/$3$2", $string);
echo $newString,"\n";

输出:

<a some_attribute href="https://www.someurl.comfiles/something.pdf" class="abc">A link</a>, some other text, <a class="def" href="https://www.someurl.com/files/somethingelse.pdf" attr="xyz">A different link</a>