我有一个包含网址的字符串,我需要用链接替换该网址,但前提是链接位于域名的白名单中。我有一个模式用链接替换网址,但我不知道如何将该接受域列表放在模式中。我使用以下代码:
$pattern = '/\b((http(s?):\/\/)|(?=www\.))(\S+)/is';
preg_replace($pattern,
'<a href="$1$4" target="_blank">$1$4</a>',
$string);
答案 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.com
或subdomain.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;
请告诉我这是否适合您。