链接的正则表达式

时间:2014-03-04 16:08:40

标签: php regex

我有一个包含网址的字符串,我需要用链接替换该网址,但前提是链接位于域名的白名单中。我有一个模式用链接替换网址,但我不知道如何将该接受域列表放在模式中。我使用以下代码:

$pattern = '/\b((http(s?):\/\/)|(?=www\.))(\S+)/is';

preg_replace($pattern,
         '<a href="$1$4" target="_blank">$1$4</a>',
         $string);

1 个答案:

答案 0 :(得分:1)

在执行REGEX操作之前,您只需检查域名是否出现在白名单中。

<?php

$whitelist = array('http://www.google.com', 'http://www.yahoo.com');

$string = 'http://www.google.com';

if (in_array($string, $whitelist)) {

    $pattern = '/\b((http(s?):\/\/)|(?=www\.))(\S+)/is';

    $string = preg_replace($pattern, '<a href="$1$4" target="_blank">$1$4</a>', $string);

}

print $string;

编辑:

为此,我将字符串转换为数组,然后循环遍历该数组的每个部分。然后我检查了该数组部分是否与任何白名单词匹配。如果是这样,那么我就会把你的REGEX东西放进去;如果没有,它就一个人留下。然后我将每个部分添加回一个数组,然后我转回一个字符串。我还应用CodeAngry建议使用~代替/来匹配网址。

<?php

$domain_array_new = array();    
$whitelist = array('google.com', 'yahoo.com');

$string = 'subdomain.google.com Lorem yahoo.com Ipsum is simply microsoft.com dummy text www.google.com of the printing and typesetting industry.';

$domain_array = explode(' ', $string);

foreach ($domain_array AS $domain_part) {

    foreach ($whitelist AS $whitelist_domain) {

        if (preg_match('/'.preg_quote($whitelist_domain, '/').'/', $domain_part)) {

            $pattern = '~\b((http(s?)://)|(?=www\.))(\S+)~is';
            $domain_part = preg_replace($pattern, '<a href="$1$4" target="_blank">$1$4</a>', $domain_part);

        }

    }

    $domain_array_new[] = $domain_part;

}

$string = implode(' ', $domain_array_new);

print $string;

现在,这有点工作,但你需要在正则表达式上做更多的工作。它选择的唯一网址是www.google.com。它没有选择yahoo.comsubdomain.google.com,因为它们前面没有http(s)?www

编辑#2:

我更多地使用了这个,并提出了一种更简单的方法来进行查找替换而不是将其分解为数组,处理它然后将其转换回字符串。

// YOUR WHITELIST ARRAY
$whitelist = array('google.com', 'yahoo.com', 'microsoft.com');

// TURN YOUR ARRAY INTO AN "OR" STRING TO BE USED FOR MATCHING
$whitelist_matching_string = implode('|', $whitelist);

// DO AN INLINE FIND/REPLACE
$string = preg_replace('~((http(s)?://)?(([-A-Z0-9.]+)?('.$whitelist_matching_string.')(\S+)?))~i', '<a href="http://$4">$1</a>', $string);

print $string;

请告诉我这是否适合您。