Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 链接的正则表达式_Php_Regex - Fatal编程技术网

Php 链接的正则表达式

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

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

$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;