Php 从html输入字符串中删除带有完整基本url的协议和结果

Php 从html输入字符串中删除带有完整基本url的协议和结果,php,regex,while-loop,preg-replace,Php,Regex,While Loop,Preg Replace,我想从html input=text提供的输入中去掉base_url,并从_POST中提取。输入本身很可能包含完整的uri,但也可能包含/并且很可能包含端口分配,后跟几个路径分隔符 示例:_definst_ 我需要最多3个结果的实例化,这些值最终被放入一个数组中 因此,为了在独立脚本中进行测试,我编写了以下代码: 历史回顾: <?php $var1 = "https://lab1.sfo1.transparentpixel.com:1935/rtsp/_definst_"; $var2 =

我想从html input=text提供的输入中去掉base_url,并从_POST中提取。输入本身很可能包含完整的uri,但也可能包含/并且很可能包含端口分配,后跟几个路径分隔符

示例:_definst_

我需要最多3个结果的实例化,这些值最终被放入一个数组中

因此,为了在独立脚本中进行测试,我编写了以下代码:

历史回顾:

<?php
$var1 = "https://lab1.sfo1.transparentpixel.com:1935/rtsp/_definst_";
$var2 = "http://lab1.sfo1.transparentpixel.com:1935/rtmp/_definst_";
$var3 = "lab1.sfo1.transparentpixel.com";

$count = 1;
while ( $count <= 3 )
{
$test[] = 'var'.$count.' = ' . preg_replace(array("#^.*/([^\:]+)\:.*#"), '$1', ${var.$count});
$count++;
}

var_dump($test);
?>
虽然这是我想要的,但我肯定错过了一些迭代。有人愿意解释我可能忽略的事情吗?是的,我知道我可以用str_替换,但在总体方案中,运行preg_over str_的成本是最低的

我只是在寻找洞察力,因为我100%确信我不是关于reg ex或preg_replace的任何方面的大师


输入?

我希望我能正确理解你的问题。您是否对正则表达式或在URL上循环的代码有问题?或者两者都有

我将假设两者都是

我建议您只匹配您想要提取的内容,而不是匹配整个内容并对您想要提取的内容进行分组。考虑到这一点,正则表达式可以如下所示:

[^/]+\.[^/:]{2,3}

这句话的英文意思是:

匹配除正斜杠以外的任何内容,直到有一个点,然后再匹配除正斜杠或冒号以外的2到3个内容

这看起来很简单,但我认为它能满足你的需要

下面是一段php代码,它以各种格式创建一个URL数组,然后循环遍历每一个URL,并提取我认为您需要的内容。我已切换到使用
preg\u match
而不是
preg\u replace
,因为我认为在这种情况下它更有意义:

<?php
    $urls = array(
                "https://lab1.sfo1.transparentpixel.co.jp:1935/rtsp/_definst_",
                "http://lab1.sfo1.transparentpixel.com:1935/rtmp/_definst_",
                "http://lab1.sfo1.transparentpixel.com/rtmp/_definst_",
                "lab1.sfo1.transparentpixel.com",
                "someurl.com:1935/rtmp/_definst_",
                "someurl.com/_definst_",
                "http://someurl.co.uk");

    foreach($urls as $url)
    {
        preg_match('%[^/]+\.[^/:]{2,3}%m', $url, $matches);         
        echo $matches[0]; // instead of this you could do $test[] = $matches[0];  
    }
?>

您给出的这三个url是唯一可能的url类型吗?例如,您还可以使用
http://someurl.com
someurl.com:1935/rtmp/_definst_uu
?你说这段代码“按照我的意图工作”,但当我运行它时,它不工作,因为你把${var.$count}放进去了。我认为这是错误的。还有,我不知道你的问题是什么?在将主机部分添加到一个新数组中时,是否尝试循环浏览URL列表?我已经更正了上面的代码Robbie。谢谢在本例中使用变量是正确的,但我复制了代码,其中我将变量声明为“var”,php显然不喜欢它直到不使用$var。。。。URL列表基本上是由最终用户输入的,但很可能是从我们的仪表板复制的,因此我可以预期其格式将类似于我在示例中使用的格式。但是,是的,我只想要基本url sans协议。Robbie,循环本身正在按照我的预期工作(参见上面的编辑)。正则表达式是我关心的问题。谢谢你的回复!关于迭代,我只为这个特定参数设置了最多3个输入。所以没有必要增加额外的费用,但我明白你在这方面的观点。匹配我想提取的片段可能会更好。我要试一试。谢谢你对正则表达式的额外关注!我想这在preg_中也同样有效?编程上有区别吗?@msmithng是的,在使用它的方式上有区别,因为它只匹配您想要的位,所以您可以使用它从输入中将该位提取到新变量中。但是,我仍然不能确定我是否理解您的问题,因为您的代码似乎已经实现了您想要的功能?您有什么问题需要解决,或者您只是想征求对您所采取的方法的意见?@msmithong抱歉,我还应该提到的是,如果您在代码中使用我的正则表达式,它将返回与您想要的完全相反的结果(例如,对于第一个url,https://:1935/rtsp/_definst)。老实说,我建议的正则表达式更改只是因为我认为在代码中使用
preg\u match
更具可读性(在我看来),如果您的方法有效并且对您有意义,那么就使用它。关于你原来的帖子的一个问题。。。你说的“我肯定错过了一些迭代”是什么意思?谢谢你提供的额外见解。非常有用。写下我对缺失迭代的概念;我觉得,当我在regex的时候。。。我会错过仪表板上的一些奇怪的复制面食(用户总是做他们最擅长的事情)。我想我应该把我的问题表述为“如果有预期的输入,我会错过什么吗?”。另外,你是对的,我正在寻找对我的方法的评论。
$ php tpixel_url_replace.php 
Array
(
    [0] => url1 = lab1.sfo1.transparentpixel.com
    [1] => url2 = lab1.sfo1.transparentpixel.com
    [2] => url3 = lab1.sfo1.transparentpixel.com
)
<?php
    $urls = array(
                "https://lab1.sfo1.transparentpixel.co.jp:1935/rtsp/_definst_",
                "http://lab1.sfo1.transparentpixel.com:1935/rtmp/_definst_",
                "http://lab1.sfo1.transparentpixel.com/rtmp/_definst_",
                "lab1.sfo1.transparentpixel.com",
                "someurl.com:1935/rtmp/_definst_",
                "someurl.com/_definst_",
                "http://someurl.co.uk");

    foreach($urls as $url)
    {
        preg_match('%[^/]+\.[^/:]{2,3}%m', $url, $matches);         
        echo $matches[0]; // instead of this you could do $test[] = $matches[0];  
    }
?>
lab1.sfo1.transparentpixel.co.jp
lab1.sfo1.transparentpixel.com
lab1.sfo1.transparentpixel.com
lab1.sfo1.transparentpixel.com
someurl.com
someurl.com
someurl.co.uk