есть урлы видов: http://www.example.ru/ http://example.ru/ http://www.st.example.ru/ http://st.example.ru/ http://(http://)+www.st.example.ru/ (то же самое с остальными примерами) нужно в итоге получить http://example.ru (или же http://st.example.ru).
в строке может быть больше одного http-a. в любом случае, нужно оставить только протокол, доменная зона, домен второго уровня и домен третьего, если он не www
PHP: <?php $text = '.....'; // Ваши URL-ы $pattern = '/^(https?\:\/\/(?:[a-z-]+\.)?[a-z-]+\.[a-z]+)$/'; preg_match_all( $pattern, $text, $matches); if( !empty($matches[1])) { foreach( $matches[1] as $url) if( strstr( $url, '/www.') === false) echo $url ."<br />\r\n"; } ?> Можно как-то так попробовать. regex'ом лучше не злоупотреблять.
спасибо за помощь, но это не помогло. совсем ниаких совпадений. я, наверное, неправильно описал. есть урлы любого вида, с произвольным количеством http-а спереди и www. нужно взять только протокол и, собственно, домен. для упрощения случая, допустим у меня одна переменная и в ней хранится одно урл.
PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); $m='http[s]://www.example.ru/ http[s]://example.ru/ http[s]://www.st.example.ru/ http[s]://st.example.ru/'; $poisk='|http\[s\]:\/\/(www.)?|si'; $zamena='http://'; $new=preg_replace($poisk,$zamena,$m); echo $new; ?> Выводит так http://example.ru/ http://example.ru/ http://st.example.ru/ http://st.example.ru/
Так в столбик PHP: <?php ini_set('display_errors',1); error_reporting(E_ALL); $m='http[s]://www.example.ru/ http[s]://example.ru/ http[s]://www.st.example.ru/ http[s]://st.example.ru/'; $poisk='|http\[s\]:\/\/(www.)?|si'; $zamena='http://'; $new=preg_replace($poisk,$zamena,$m); $new2=explode(' ', $new); $i=0; while($i<count($new2)) { echo $new2[$i]; echo '<br>'; $i++; } ?>