我有一个包含大量链接的PHP String $菜单.我需要用基于链接的ID替换href.
我需要
这就是我所拥有的:
<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>
Run Code Online (Sandbox Code Playgroud)
这就是我想要的:
<a href="#start">Link</a>
<a href="#contact">Another Link</a>
<a href="#contact-sub">Another Link</a>
Run Code Online (Sandbox Code Playgroud)
我用preg_replace试了一下
$search = array(
"/http:\/\/www.test.de/",
"/".preg_quote('/">', '/')."/"
);
$replacement = array('#','">');
$menu = preg_replace($search,$replacement,$menu);
Run Code Online (Sandbox Code Playgroud)
我的解决方案看起来有点"脏,并没有取代中间的斜线.任何想法"真正的"模式来完成这个?
这可以通过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();
Run Code Online (Sandbox Code Playgroud)