PHP preg_split () не захватывает разделение в строке - PullRequest
2 голосов
/ 26 января 2012

Я пытаюсь использовать регулярное выражение с 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)

Не уверен, что я здесь делаю не так ... любой совет будет оценен.

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Попробуйте добавить другой набор скобок для захвата всего URL-адреса с помощью необязательного параметра preg_split ():

$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) ""
}
1 голос
/ 26 января 2012

Это сбой, потому что вы разделяете на 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://
0 голосов
/ 26 января 2012

Первая проблема в том, что ваше регулярное выражение не с разделителями (т.е. не окружено косыми чертами).

Вторая проблема заключается в том, что с учетом предоставленного вами примера вывода вы можете посмотретьвместо использования preg_match .

Попробуйте, посмотрите, хотите ли вы:

$body = "blah blah blah http://localhost/tomato/veggie?=32";
$regex = "/^(.*?)((?:(?:f|ht)tps?:\/\/).+)/i";
preg_match($regex, $body, $url);
print_r($url);
...