1

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

示例:https: //lab1.sfo1.transparentpixel.com:554/rtmp/ _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);
?>

编辑后更正:

<?php

    $url1 = "https://lab1.sfo1.transparentpixel.com:1935/rtsp/_definst_";
    $url2 = "http://lab1.sfo1.transparentpixel.com:1935/rtmp/_definst_";
    $url3 = "lab1.sfo1.transparentpixel.com";

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

print_r($test);
?>

我的结果:

$ php tpixel_url_replace.php 
Array
(
    [0] => url1 = lab1.sfo1.transparentpixel.com
    [1] => url2 = lab1.sfo1.transparentpixel.com
    [2] => url3 = lab1.sfo1.transparentpixel.com
)

虽然这按我的预期工作,但我肯定会错过一些迭代。有人愿意澄清我可能忽略的事情吗?是的,我知道我可以使用 str_replace,但是在整个方案中运行 preg_ over str_ 的成本是最小的。

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

输入?

4

1 回答 1

2

我希望我能正确理解你的问题。您在使用正则表达式或循环 URL 的代码时遇到问题吗?或两者?

我将假设两者...

我建议您仅匹配要提取的内容,而不是匹配整个事物并将要提取的位分组。考虑到这一点,正则表达式可能如下所示:

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

用英语说:

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

这看起来很简单,但我认为它可以满足您的需求。

这是一些 php 代码,它以各种格式创建一个 url 数组,然后循环遍历每个格式并提取我认为你想要的位。我已经改用使用preg_match而不是preg_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];  
    }
?>

您会注意到我正在使用foreach 循环遍历数组,这意味着我们不限于您的示例中的固定迭代次数。

这个的输出是:

lab1.sfo1.transparentpixel.co.jp
lab1.sfo1.transparentpixel.com
lab1.sfo1.transparentpixel.com
lab1.sfo1.transparentpixel.com
someurl.com
someurl.com
someurl.co.uk
于 2012-04-03T23:03:19.083 回答