2012-04-03 6 views
1

私はhtml input = text経由で入力されたbase_urlを取り除き、_POSTから取り出しました。入力そのものは完全なURIを含むと予想される可能性が最も高いですが、おそらくはポートの割り当てに続いていくつかのパス区切り文字が続きます。html入力文字列から完全なbase_urlでプロトコルと結果を削除します

例:私は3つの結果のインスタンスとそれらの値まで必要https://lab1.sfo1.transparentpixel.com:554/rtmp/ _definst_

は、アレイ内に配置なってしまいます。 HISTORICAL REVIEW FOR

OLD:

<?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); 
?> 

EDIT後に修正:

だから私は、次のコードになってしまった、スタンドアロンスクリプトで物事をテストする

<?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_を実行するコストは、全体のスキームの中で最小です。

私は単に私がreg-exやpreg_replaceに関して何かのマスターではないと確信しているので、単に洞察力を求めています。

入力?

+0

あなたは、URLの唯一の可能なタイプを与えてくれたものを3つのURLですか?たとえば、 'http:// someurl.com'や' someurl.com:1935/rtmp/_definst_'もできますか? – Robbie

+0

あなたはこのコードが "私が意図した通りに動作する"と言っていますが、私がそれを実行すると$ {var。$ count}を置いたので動作しません。どちらが間違っている(私は思う)。また、あなたの質問が何であるか分かりません。あなたは新しい配列にホスト部分だけを追加しながらURLのリストをループさせようとしていますか? – Robbie

+0

Robbieより上のコードを修正しました。ありがとう!この場合変数変数を使うのは正しいですが、私は変数を "var"と宣言したコードをコピーしていましたが、これは明らかにPHPが好きではありません。 :| TILは$ varを使用しません。 – msmithng

答えて

2

私はあなたの質問を正しく理解していただきたいと思います。正規表現やURLをループするコードに問題がありますか?または両方?私が代わりに全体のことを照合し、抽出したいビットをグループ化する...

の両方を想定するつもりです

、私はあなたが抽出したいだけのものと一致してお勧めします。このことを念頭に置いて、正規表現は次のようになります。この英語

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

は言う:

ドットがあるまで、スラッシュを除く

マッチ何が、その後、2と3の間で一致スラッシュやコロンを除くその他のもの

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

URLの配列をさまざまな形式で作成し、それぞれをループして、必要と思うビットだけを抽出するPHPコードです。

<?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 loopを使用して、配列をループしていていることに気づくでしょう:私は、それはこの場合に、より理にかなっていると思うので、私はpreg_match代わりのpreg_replaceを使用してに切り替えましたあなたの例のように固定数の反復。

これの出力は次のとおりです。

lab1.sfo1.transparentpixel.co.jp 
lab1.sfo1.transparentpixel.com 
lab1.sfo1.transparentpixel.com 
lab1.sfo1.transparentpixel.com 
someurl.com 
someurl.com 
someurl.co.uk 
+0

Robbie、ループ自体は私の期待どおりに動作しています(上記の私の編集を参照)。正規表現は私の心配でした。お返事をありがとうございます!反復に関しては、この特定のパラメータに対して最大3つの入力のみを設定しています。だから追加する必要はありませんが、私はその点であなたのポイントを参照してください。私が抽出したい部分をマッチングすると、よりうまくいくかもしれません。私はそのショットを与えるでしょう。正規表現の余分な目をありがとう!私はこれは同じpreg_replaceで動作すると思いますか?プログラムによって違いはありますか? – msmithng

+0

@msmithngええ、あなたが望むビットにしかマッチしないので、それを使う方法に違いがあります。そのため、そのビットを入力から新しい変数に抽出するために使用します。しかし、私はあなたのコードが既にあなたが望むように見えるように見えるので、私はあなたの質問を得ることはまだわからないのですか?どのような問題を修正する必要がありますか、またはあなたが取ったアプローチについてのコメントを求めていますか? – Robbie

+0

@msmithng申し訳ありませんが、私はあなたのコードで私の正規表現を使用する場合、それはあなたが望むものの正反対を返すことに違いがあるということも言及しておきます(例えば 'https://:1935/rtsp/_definst_'最初のURL)。正直言って、私が提案した正規表現の変更は、コード内で 'preg_match'を使うのが読みやすく(私の意見では)、あなたの作品がうまくいれば、その方法が意味をなさないと思うからです。あなたの元の投稿についての1つの質問...「私は確かにいくつかの反復を見逃していますか? – Robbie