【问题标题】:Clean URL Title干净的 URL 标题
【发布时间】:2017-12-16 07:44:25
【问题描述】:

大家早上好。我有一个标题为“The LAST JEDI Will Rock You (Review)”的博客

我有一个php函数

function get_url_text( $string, $separator = '-')
{
    $accents_regex = '~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i';
    $special_cases = array( '&' => 'and', "'" => '');
    $string = mb_strtolower( trim( $string ), 'UTF-8' );
    $string = str_replace( array_keys($special_cases), array_values( $special_cases), $string );
    $string = preg_replace( $accents_regex, '$1', htmlentities( $string, ENT_QUOTES, 'UTF-8' ) );
    $string = preg_replace("/[^a-z0-9]/u", "$separator", $string);
    $string = preg_replace("/[$separator]+/u", "$separator", $string);
    return $string;
}

在我通过函数运行标题之后。

get_url_text("THE LAST JEDI Will Rock You (Review)");

我得到如下结果:

the-last-jedi-will-rock-you-review-

所以看起来函数将最后一个字符')'变成了'-'

我希望我的结果是

the-last-jedi-will-rock-you-review

最后没有'-'。为了实现这一点,我需要对函数进行哪些更改?

【问题讨论】:

  • trim($str, '-')
  • rtrim($str,'-') ?

标签: php regex


【解决方案1】:

要么做return trim($string,'-');要么做rtrim($str,'-');

参考:-

trim()

rtrim()

【讨论】:

    【解决方案2】:

    似乎你可以大大简化你的方法

    <?php
    $title  = "THE LAST JEDI Will Rock You (Review)";
    $url     = rtrim(strtolower(preg_replace('~\W+~', '-', $title)), '-');
    echo $url;
    # the-last-jedi-will-rock-you-review
    ?>
    

    注意这里的\W+,它会查找非单词字符并将它们替换为-

    【讨论】:

    • 或者没有修剪功能strtolower(preg_replace(['~\W++(?!\Z)~', '~\W++$|^\W++~'], ['-'], $title));
    • 虽然您的建议适用于示例输入字符串。对于 OP 的方法似乎关注的所有边缘情况,它肯定表现不佳。 sandbox.onlinephpfunctions.com/code/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多