1

私は次のようなテキストを持っています:

61  me  xxxx.com
60  aici    xxx.com/ 
59  here    9gag.com    

一部のリンクの前にはhttp://がありますが、そうでないものもあります。URLを次のように置き換えたい

'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://

テキストのフォーマットについて申し訳ありません。

後で編集:

つまり、リンクが正しく置き換えられず、「http://」が数回表示されるだけです。なぜそれをするのか、何か考えはありますか?これに対するより良い解決策はありますか?

4

2 に答える 2

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);
于 2012-11-07T12:26:15.793 に答える
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;
}
于 2012-11-07T13:25:37.827 に答える