1

html input = textを介して提供され、_POSTから取得された入力からbase_urlを削除しようとしていました。入力自体には完全な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を使用できたはずですが、全体的なスキームでは、str_上でpreg_を実行するコストは最小限です。

私は正規表現やpreg_replaceに関することを何もマスターしていないと100%確信しているので、単に洞察を探しています。

入力?

4

1 に答える 1

2

私はあなたの質問を正しく理解することを望みます。URLをループするための正規表現またはコードに問題がありますか?または両方?

私は両方を想定するつもりです...

全体を一致させて抽出したいビットをグループ化するのではなく、抽出したいものだけを一致させることをお勧めします。それを念頭に置いて、正規表現は次のようになります。

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

英語でこれは言う:

ドットができるまでスラッシュ以外のすべてに一致し、次にスラッシュまたはコロン以外のすべてに2〜3個一致します

これは簡単に思えますが、必要なものが得られると思います。

これは、さまざまな形式のURLの配列を作成し、それぞれをループして、必要なビットだけを抽出するphpコードです。この場合はもっと理にかなっていると思うので、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 に答える