Php 如何将www.添加到文本文件中的URL

Php 如何将www.添加到文本文件中的URL,php,regex,Php,Regex,我有一个包含很多URL的文本文件。有些URL以www.和http://开头,有些URL则以零开头 我想在文本文件中URL不以www.或http://开头的每一行前面添加www. $lines = file("sites.txt"); foreach($lines as $line) { if(substr($line, 0, 3) != "www" && substr($line, 0, 7) != "http://" ) { } } 这就是我现在掌握的密码

我有一个包含很多URL的文本文件。有些URL以
www.
http://
开头,有些URL则以零开头

我想在文本文件中URL不以
www.
http://
开头的每一行前面添加
www.

$lines = file("sites.txt");

foreach($lines as $line) {
    if(substr($line, 0, 3) != "www" && substr($line, 0, 7) != "http://" ) {

    }
}

这就是我现在掌握的密码。我知道它不多,但我不知道如何在每个不匹配的行前面添加
www.

这将添加
www.
,如果不存在,并且如果找到的行中有http/httpS,它将起作用

$url = preg_replace("#http(s)?://(?:www\.)?#","http\\1://www.", $url);
此正则表达式将在以下方面起作用:

domain.ext->
www.domain.ext->
->
->(注意httpS)
->(注意httpS)


正则表达式解释:
http(s)?://
->http可能不存在,以防存在。
(?:www\)?
->
www.
可能不在那里。不要保存(
?:
),我们无论如何都要添加它

然后,我们在替换值中使用
\\1
,以允许http**S**在存在时保持工作状态。

此外,所有字符串
substr
函数在https上都会失败,因为它长了1个字符。

这将添加
www.
,如果不存在,并且如果找到的行中有http/https,它将工作

$url = preg_replace("#http(s)?://(?:www\.)?#","http\\1://www.", $url);
此正则表达式将在以下方面起作用:

domain.ext->
www.domain.ext->
->
->(注意httpS)
->(注意httpS)


正则表达式解释:
http(s)?://
->http可能不存在,以防存在。
(?:www\)?
->
www.
可能不在那里。不要保存(
?:
),我们无论如何都要添加它

然后,我们在替换值中使用
\\1
,以允许http**S**在存在时保持工作状态。

此外,所有字符串
substr
函数在https上都会失败,因为它长了1个字符。

诀窍是通过引用传递
$行,这样您就可以更改它们:

foreach($lines as &$line) { // note the  '&'

    // http:// and www. is missing:
    if(stripos($line, 'http://www.') === false) {
        $line = 'http://www.' . $line;

    // only http:// is missing:
    } elseif(stripos($line, 'http://www.') !== false && stripos($line, 'http://') === false) {
        $line = 'http://' . $line;

    // only www. is missing:
    } elseif(stripos($line, 'http://') !== 0 && stripos($line, 'www.') !== 0)
        $line = 'http://www.' . str_replace('http://', '', $line);

    // nothing is missing:
    } else {
    }
}
注意:

简单地将
www.
添加到非www域可能是错误的,因为
www.example.com
example.com
可以具有完全不同的内容、不同的服务器、不同的目的地和不同的DNS映射。添加
http://
很好,但不要添加
www.

要将新数组写回文件,请使用:

file_put_contents(implode(PHP_EOL, $lines), 'sites.txt');

诀窍是通过引用传递
$行
,以便您能够更改它们:

foreach($lines as &$line) { // note the  '&'

    // http:// and www. is missing:
    if(stripos($line, 'http://www.') === false) {
        $line = 'http://www.' . $line;

    // only http:// is missing:
    } elseif(stripos($line, 'http://www.') !== false && stripos($line, 'http://') === false) {
        $line = 'http://' . $line;

    // only www. is missing:
    } elseif(stripos($line, 'http://') !== 0 && stripos($line, 'www.') !== 0)
        $line = 'http://www.' . str_replace('http://', '', $line);

    // nothing is missing:
    } else {
    }
}
注意:

简单地将
www.
添加到非www域可能是错误的,因为
www.example.com
example.com
可以具有完全不同的内容、不同的服务器、不同的目的地和不同的DNS映射。添加
http://
很好,但不要添加
www.

要将新数组写回文件,请使用:

file_put_contents(implode(PHP_EOL, $lines), 'sites.txt');
使用以下命令: 只有3行

<?
    $g0 = file_get_contents("site");
    #--------------------------------------------------
    $g1 = preg_replace("#^http://#m","",$g0);
    $g2 = preg_replace("/^www\./m","",$g1);
    $g3 = preg_replace("/^/m","http://",$g2);
    #--------------------------------------------------
    file_put_contents("site2",$g3);
?>
输出文件:

http://1.com
http://d.som
http://ss.com
http://ss.com
使用以下命令: 只有3行

<?
    $g0 = file_get_contents("site");
    #--------------------------------------------------
    $g1 = preg_replace("#^http://#m","",$g0);
    $g2 = preg_replace("/^www\./m","",$g1);
    $g3 = preg_replace("/^/m","http://",$g2);
    #--------------------------------------------------
    file_put_contents("site2",$g3);
?>
输出文件:

http://1.com
http://d.som
http://ss.com
http://ss.com


请显示您已经拥有的代码,以便我们可以通过您想要的if语句对其进行扩展。您可以显示您已经尝试过的内容吗?您尝试过什么正则表达式吗?请在问题中添加textfile的数据。请显示您已经拥有的代码,因此,我们可以通过您想要的if语句对其进行扩展。您可以展示您已经尝试了什么吗?您尝试了什么正则表达式?请在您的问题中添加textfile的数据。这是否也会替换文本文件中的行?@user3552670 no,但是使用
file\u put\u contents
进行更新,这将在您有httpS条目时失败。可能不是问题,只是一个注释。这是否也会替换文本文件中的行?@user3552670否,但使用
file\u put\u contents
进行更新这将在您有httpS条目时失败。可能不是问题,只是一个注释。将其设置为全正则表达式解决方案。将其设置为全正则表达式解决方案。这还会替换文本文件中的行吗?这也会替换文本文件中的行吗?您是正则表达式,但不;不要使用正则表达式的幂。相反,您可以运行3次慢速正则表达式功能来完成一个比基本字符串替换函数还要多的头发…@Martijn:但是初学者很容易理解!!呵呵,我不同意,但替代方案可能是件好事。这在大文件上会非常慢。大型操作的快速代码,而不是不能多次运行的代码!!你是正则表达式,但不要;不要使用正则表达式的幂。相反,您可以运行3次慢速正则表达式功能来完成一个比基本字符串替换函数还要多的头发…@Martijn:但是初学者很容易理解!!呵呵,我不同意,但替代方案可能是件好事。这在大文件上会非常慢。大型操作的快速代码,而不是不能多次运行的代码!!