我的文字如下:
61 me xxxx.com
60 aici xxx.com/
59 here 9gag.com
有些链接在他们面前有http://,有些没有。 我想用
替换网址'http://'.$url
所以这就是我所做的:
我的链接位于以下数组中:
$links
我这样做:
foreach($links as $link){
if (!preg_match("~^(?:f|ht)tps?://~i", $link)) {
$links2[] = "http://" . $link;
}
}
之后:
$str=str_replace($links, $links2, $str);
我的文字现在显示:
61 me http://http://http://http://http://http://
60 aici http://http://http://http://http://
59 here http://http://http://http://http://
很抱歉文字格式化。
LATER EDIT:
换句话说,它没有正确替换链接,它只是多次放“http://”。 任何想法为什么这样做?对此更好的解决方案吗?
答案 0 :(得分:1)
str_replace()
函数,因为它实际上并不尊重之前的函数(这是preg_*
函数的作用)。
我建议采用完全不同的方法。很抱歉全部更改我的回答。
$links = array(
'xxxx.com',
'xxx.com/',
'9gag.com',
'www.google.com'
);
foreach ($links as &$link) $link = preg_quote($link,'~');
// make each array item quoted/ready for use in a pattern
unset($link);
// delete reference
$rx = '~\b(?<!(?<=ftp|ftps|http|https)://)(' . implode('|',$links) . ')\b~i';
// first word boundary character eliminates links like "axxx.com"
// implode part makes it (xxxx\.com|xxx\.com|9gag\.com|www\.google\.com)
// and first parentesized part basically says
// "not preceded by ftp:// ftps:// http:// https://"
$str = "Here are some links: xxxx.com, axxx.com, http://www.google.com";
var_dump($str);
$str = preg_replace($rx,'http://$0',$str);
// replace all applicable links
var_dump($str);
答案 1 :(得分:0)
你可以使用像这样的负前瞻正则表达式将http://
放在任何需要的地方,如下所示:
// assuming your input file is input.txt
$lines = file("input.txt");
foreach($lines as $line) {
$arr = explode(' ', $line);
$arr[2] = preg_replace('#(?!^https?://)^(.+)$#i', 'http://$1', $arr[2]);
$line = implode(' ', $arr);
echo $line;
}