用有效的ID替换URL

3

我有一个带有大量链接的PHP字符串$menu。我需要根据链接替换href为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);

我的解决方案看起来有点“不简洁”,并且没有替换中间的斜杠。 是否有更好的方法来实现这个功能?


域名是否总是相同的? - Lawson
为了让事情变得更简单,您可以使用 preg_replace_callback 并广泛匹配 <A ...> 标签。然后使用多个 str_replace() 重写它们的内部。这很快,而且有效,但仅适用于简单的情况,即所有链接都是这样创建的。如果您开始拥有更复杂的标签,可能带有内联样式或引入空格转义引号的 Javascript,则正则表达式将无法工作,Jack 的解决方案是您唯一实际的选择。 - LSerni
5个回答

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


请将以下与编程有关的内容从英语翻译成中文:“对于最强大的解决方案+1(regexp用于HTML解析是不好的:https://dev59.com/X3I-5IYBdhLWcg3wq6do)” - LSerni
是的,域名始终相同。感谢您的好建议 - 我会立即尝试。 - neosmart

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


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
  • 将固定名称的域更改为#
  • 从结尾删除 /
  • 用 - 替换 /

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接