【问题标题】:Replace URL with valid ID用有效的 ID 替换 URL
【发布时间】:2013-04-17 13:26:45
【问题描述】:

我有一个带有很多链接的 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);

我的解决方案看起来有点“脏”,并且没有替换中间的斜线。有什么想法可以用“真实”的模式来完成吗?

【问题讨论】:

  • 域总是一样的吗?
  • 为了方便起见,您可以使用preg_replace_callback 并广泛匹配&lt;A ...&gt; 标签。然后用多个str_replace() 重写它们的内部结构。这很快,并且会起作用,但只适用于简单的场景,所有链接都以这种方式制作。如果您开始使用更复杂的标签,可能使用引入 空格转义引号 的内联样式或 Javascript,则正则表达式将不起作用,而 Jack 的解决方案是您唯一可行的办法。

标签: php regex


【解决方案1】:

这可以通过 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 是最强大的解决方案(用于 HTML 解析的正则表达式不好:stackoverflow.com/questions/1732348/…
  • 是的,域名始终相同。感谢您的精彩提示 - 我会立即尝试。
  • 非常感谢 - 完美的解决方案!
【解决方案2】:

你可以使用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

【讨论】:

    【解决方案3】:

    如果域总是相同的尝试:

    str_replace("http://www.test.de/","#", $menu);
    

    【讨论】:

      【解决方案4】:
      // 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);
      

      【讨论】:

        【解决方案5】:
        • 将固定域名改为#
        • 从末端修剪/
        • 将 / 替换为 -

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-10
          • 2017-03-04
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          • 1970-01-01
          • 2017-07-28
          相关资源
          最近更新 更多