Соответствие URL-адресов PHP и использование preg_replace_callback ()

Я использую следующее, чтобы найти все URL внутри $ content

 $content = preg_match_all( '/(http[s]?:[^\s]*)/i', $content, $links );

Но это будет зависеть от http:// части в http://www.google.com/some/path.

Мои вопросы:

1 - Как я могу изменить его, чтобы использовать ссылки, которые начинаются только с www, например www.google.com?

2 - Основная цель - найти ссылки и заменить их значением, возвращаемым другой функцией. Я пробовал preg_match_callback (), но он не работает (вероятно, неправильно использовал ..

$content = preg_replace_callback(
           "/(http[s]?:[^\s]*)/i",
            "my_callback",
            $content);

function my_callback(){

// do a lot of stuff independently of preg_replace
// adding to =.output...

return $output;
}

Теперь, по моей логике (которая, вероятно, неверна), все совпадения из $content будут заменены на $output. Что я делаю неправильно ?

(пожалуйста, никаких анонимных функций - я тестирую на старом сервере)

ИЗМЕНИТЬ I - после комментариев, пытаюсь уточнить подробности

function o99_simple_parse($content){

$content = preg_replace_callback( '/(http[s]?:[^\s]*)/i', 'o99_simple_callback', $content );


return $content;
}

Перезвони :

function o99_simple_callback($url){
    // how to get the URL which is actually the match? and width ??
        $url = esc_url_raw( $link );
        $url_name = parse_url($url); 
        $url_name = $description = $url_name['host'];// get rid of http://..
        $url = 'http://something' .  urlencode($url)   . '?w=' . $width ; 
        return $url; // what i really need to replace 
    }

person Obmerk Kronen    schedule 27.03.2013    source источник
comment
проверьте это: stackoverflow.com/ вопросы / 1755144 /, особенно ответ velcrow.   -  person Gaël    schedule 27.03.2013
comment
спасибо, но он игнорирует URL-адреса HTTP и HTTPS? . также нет информации о обратном вызове. в основном это конкатенация двух регулярных выражений, нет?   -  person Obmerk Kronen    schedule 27.03.2013


Ответы (1)


Чтобы изменить регулярное выражение, вам уже нужно разрешить URL-адреса, начинающиеся с www, вы должны просто написать это:

/((http[s]?:|www[.])[^\s]*)/i
  +         ++++++++
person slackwing    schedule 27.03.2013
comment
Спасибо ! Я проверю это .. как насчет второй части обратного вызова? я неправильно использую? - person Obmerk Kronen; 27.03.2013
comment
Я не уверен, потому что вы не включили свой код. Однако my_callback должен принимать параметр, например: my_callback($matches), и вы должны использовать элементы в $matches для построения вывода. - person slackwing; 27.03.2013
comment
Похоже, вы неправильно понимаете механизм обратного вызова. Какой бы обратный вызов вы ни определили, внутреннее устройство PHP передаст параметр (ы). Независимо от того, назовете ли вы параметр $matches или $url, не имеет значения, но в случае preg_replace_callback внутренние компоненты PHP передают единственный параметр: массив групп захвата. В вашем коде в o99_simple_callback вы вызываете этот массив $url и работаете с ним, как если бы это была строка, но это неверно. URL, который вы ищете, на самом деле находится в $url[0] (а также $url[1]). - person slackwing; 27.03.2013
comment
Благодарность ! это проясняет некоторые (+1) .. но я думал, что обратный вызов работает так, что КАЖДОЕ попадание или совпадение перейдет к обратному вызову, а затем вернется к функции. в противном случае я не вижу разницы между использованием preg_match_all () и preg_replace_callback () .. но в любом случае, возможно, это материал для другого вопроса .. Спасибо за помощь .. - person Obmerk Kronen; 28.03.2013