Php 链接的正则表达式
我有一个包含URL的字符串,我需要用链接替换该URL,但前提是链接位于域的白名单中。我有一个用链接替换URL的模式,但我不知道如何将接受域列表放入该模式中。我使用以下代码:Php 链接的正则表达式,php,regex,Php,Regex,我有一个包含URL的字符串,我需要用链接替换该URL,但前提是链接位于域的白名单中。我有一个用链接替换URL的模式,但我不知道如何将接受域列表放入该模式中。我使用以下代码: $pattern = '/\b((http(s?):\/\/)|(?=www\.))(\S+)/is'; preg_replace($pattern, '<a href="$1$4" target="_blank">$1$4</a>', $string); $p
$pattern = '/\b((http(s?):\/\/)|(?=www\.))(\S+)/is';
preg_replace($pattern,
'<a href="$1$4" target="_blank">$1$4</a>',
$string);
$pattern='/\b((http(s?):\/\/)|(?=www\)(\s+)/is';
preg_替换($模式,
'',
$string);
在执行正则表达式之前,您只需检查该域是否出现在白名单中
<?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;
现在,这在某种程度上是可行的,但是您需要对正则表达式做更多的工作。它唯一获取的URL是www.google.com
。它没有选择yahoo.com
或subdomain.google.com
,因为它们前面没有http?
或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;
//您的白名单数组
$whitelist=array('google.com'、'yahoo.com'、'microsoft.com');
//将数组转换为用于匹配的“或”字符串
$whitelist_matching_string=内爆('|',$whitelist);
//执行内联查找/替换
$string=preg_replace('~(http(s):/)?([-A-Z0-9.]+)?('.$whitelist_matching_string.')(\s+))~i',''.$string);
打印$string;
让我知道这是否更适合您。您的白名单是什么样子的?它是这样一个数组:
$whitelist=array('google.com','yahoo.com')代码>?@Quixrick是的,类似这样的。它也可以在正则表达式中,最多有5个主机。字符串如下:Lorem Ipsum只是印刷和排版行业的虚拟文本www.google.com。好的,那么您需要将字符串中的域与多个域进行匹配吗?好的,NP。我将修改我的答案。你为什么要在/
中包装一个与regexp匹配的URL?对于此\/\/
?只要用“~…~i”
把它包起来就行了。而且不再转义/
,这在URL和HTML中非常常见。@CodeAngry你能添加一个例子吗?他说把你的正则表达式字符串改成这样:$pattern='~\b((http(s?)/)|(?=www\)(\s+)~is'代码>所以你不必逃避斜杠。
// 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;