2

我正在尝试使用带有 preg_split 的正则表达式将 url 从字符串中分离出来:

    $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

第一个问题是您的正则表达式没有分隔(即没有被斜线包围)。

第二个问题是,鉴于您提供的示例输出,您可能需要考虑使用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 回答