2013-04-17 4 views
3

У меня есть PHP String $ menu с большим количеством ссылок. Мне нужно заменить href идентификатором на основе ссылки.Заменить URL с действующим ID

Мне нужно

  • удалить домен
  • удалить слэши в начале и конце
  • заменить слеши в середине с «-»

Это я, что у меня есть :

<a href="http://www.test.de/start/">Link</a> 
<a href="http://www.test.de/contact/">Another Link</a> 
<a href="http://www.test.de/contact/sub/">Sub Link</a> 

И это то, что я хочу:

<a href="#start">Link</a> 
<a href="#contact">Another Link</a> 
<a href="#contact-sub">Another Link</a> 

Я судимо его с preg_replace

$search = array(
    "/http:\/\/www.test.de/", 
    "/".preg_quote('/">', '/')."/" 
); 
$replacement = array('#','">'); 
$menu = preg_replace($search,$replacement,$menu); 

Мое решение выглядит немного «грязным и не заменяет слеши в середине. Любые идеи для «реального» шаблона, чтобы это сделать?

ответ

6

Это можно легко сделать с DOM разборе:

$html = <<<EOM 
<a href="http://www.test.de/start/">Link</a> 
<a href="http://www.test.de/contact/">Another Link</a> 
<a href="http://www.test.de/contact/sub/">Sub Link</a> 
EOM; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 

foreach ($dom->getElementsByTagName('a') as $anchor) { 
    $href = $anchor->getAttribute('href'); 
    if (strpos($href, 'http://www.test.de/') === 0) { 
     $href = '#' . strtr(trim(parse_url($href, PHP_URL_PATH), '/'), '/', '-'); 
     $anchor->setAttribute('href', $href); 
    } 
} 

echo $dom->saveHTML(); 

Demo

+0

Upvote для изобретательского решения – MrGlass

+0

+1 для наиболее надежного решения (регулярное выражение для синтаксического анализа HTML - это BAD: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) – LSerni

+0

Да, домен всегда один и тот же.Спасибо за ваши отличные подсказки - я попробую это немедленно. – neosmart

0

Если домен всегда то же самое попробовать:

str_replace("http://www.test.de/","#", $menu); 
0
// Remove the domain 
$menu = str_replace("http://www.text.de","",$menu); 

// Remove the beginning/and add # 
$menu = str_replace("\"/","\"#",$menu); 

// Remove the trailing/
$menu = str_replace("/\"","\"",$menu); 

// Replace all remaining/with - 
$menu = str_replace("/","-",$menu); 
0
  • Изменение фиксированной имя домена до #
  • Обрезка/с конца
  • Replace/с -

    $domain = "http://www.test.de/" 
    str_replace('/','-',trim(str_replace($domain, '#', $menu),'/'); 
    
1

Вы можете использовать функцию PHP parse_url(); для создания массива сегментов URL.

т.е.

$url = 'http://www.test.de/contact/'; 
$urlinfo = parse_url($url); 

echo "<h2>URL INFO</h2><pre>"; 
print_r($urlinfo); 
echo "</pre>"; 
// create the id to be used 
$linkID = "#".str_replace('/','',$urlinfo['path']); 
echo $linkID; 

// OUTPUT 
<h2>URL INFO</h2> 
Array 
(
    [scheme] => http 
    [host] => www.test.de 
    [path] => /contact/ 
) 
#contact 

M

Смежные вопросы