2

文字列からURLを分離するためにpreg_splitで正規表現を使用しようとしています:

    $body = "blah blah blah http://localhost/tomato/veggie?=32";
    $regex = "(((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+)";
    $url = preg_split($regex, $body);

結果の配列は次のとおりです。

    array(2) (
    [0] => (string) blah blah blah 
    [1] => (string))

返品したい:

    array(2) (
    [0] => (string) blah blah blah 
    [1] => (string) http://localhost/tomato/veggie?=32)

ここで何が間違っているのかわかりません...アドバイスをいただければ幸いです。

4

3 に答える 3

4

オプションのpreg_split()パラメータを使用してURL全体をキャプチャするには、別の角かっこセットを追加してみてください。

$regex = "((((f|ht){1}tp://)[-a-zA-Z0-9@:%_\+.~#?&//=]+))";
$url = preg_split($regex, $body, null, PREG_SPLIT_DELIM_CAPTURE);

出力:

array(5) {
  [0]=>
  string(15) "blah blah blah "
  [1]=>
  string(34) "http://localhost/tomato/veggie?=32"
  [2]=>
  string(7) "http://"
  [3]=>
  string(2) "ht"
  [4]=>
  string(0) ""
}
于 2012-01-25T22:27:35.230 に答える
1

区切り文字ではなくURLで分割しているため、失敗しています。この場合の区切り文字は、「ftpまたはhttpの前の最後のスペース」です。

$body = "blah blah blah http://localhost/tomato/veggie?=32";
$regex = '/\s+(?=(f|ht)tp:\/\/)/';
$url = preg_split($regex, $body);

正規表現を分解するには:

\s+ - One or more spaces
(?=...) - Positive look-ahead (match stuff in this group, but don't consume it)
(f|ht)tp:\/\/ - ftp:// or http://
于 2012-01-25T22:28:03.267 に答える
0

最初の問題は、正規表現が区切られていない(つまり、スラッシュで囲まれていない) ことです。

2 番目の問題は、提供したサンプル出力を考えると、代わりにpreg_matchの使用を検討したい場合があることです。

これを試して、それがあなたが望むものかどうかを確認してください:

$body = "blah blah blah http://localhost/tomato/veggie?=32";
$regex = "/^(.*?)((?:(?:f|ht)tps?:\/\/).+)/i";
preg_match($regex, $body, $url);
print_r($url);
于 2012-01-25T22:31:49.963 に答える