0

我正在尝试将标准的 wordpress 标题转换为 slug,使所有字符小写,用破折号替换空格,并删除标题中的所有“&”符号。

所以让我们以这个标题为例:“身份与寻路

这是我的PHP:

<?php 
$title = get_the_title(); 
$lower = strtolower($title);
$noDash = str_replace(' ', '-', $lower);
$noAnd = str_replace('&', '', $noDash);
echo $noAnd;
?>

这将我的标题变成“ identity-#038;-wayfinding

小写转换有效,但将“&”替换为空无效。它将“&”转换为 HTML 特殊字符。知道如何简单地将“&”替换为空白,还可以删除之后的破折号,因此最终标题为:“identity-wayfinding”

4

5 回答 5

3

如果你想要一个 slug,有很多实用程序可以为你做这件事,但 htmlentities 或 urlencode 都不正确。Doctrine 1.2 包含一个urlizer具有一组静态函数的类,包括urilize它将以更健壮的方式完成您想要的行为(正确处理 UTF-8 和取消重音等)

可以在这里找到

如果你想要一些不太健壮但更简单的东西:

function slugify($sluggable)
{
    $sluggable = preg_replace("/[^a-zA-Z0-9\/_|+ -]/", '', $sluggable);
    $sluggable = trim($sluggable, '-');
    if( function_exists('mb_strtolower') ) { 
        $sluggable = mb_strtolower( $sluggable );
    } else { 
        $sluggable = strtolower( $sluggable );
    }
    $sluggable = preg_replace("/[\/_|+ -]+/", '-', $sluggable);

    return $sluggable;
}

这将去除非字母数字字符(但也包括重音字符)并将空格、+ 符号和连字符变成连字符。

于 2012-07-10T17:12:48.103 回答
0

使用str_replace,首先删除“”(空格),然后删除“-”,然后将 & 替换为破折号。

$title = "Identity & Wayfinding";
$title = strtolower(str_replace(array(" ","-","&"),array("","","-"),$title));

echo $title; // returns: identity-wayfinding

示例@viper7

于 2012-07-10T17:09:16.397 回答
0

你可能在谈论蛞蝓,看这些:

于 2012-07-10T17:22:19.073 回答
0

使用此代码:

 <?php
function create_slug($string){
$slug=preg_replace('/[^A-Za-z0-9-]+/', '-', $string);
$slug=ltrim($slug, "-");
$slug=rtrim($slug, "-");
return strtolower($slug);
}
echo create_slug('does this thing work or not');
//returns 'does-this-thing-work-or-not'

echo "<br />";
echo create_slug('"Identity & Wayfinding"');
?>

现场示例

当然如果你想在 Wordpress 中使用这个功能,你只需要使用这个:

<?php sanitize_title( $title, $fallback_title ) ?>

其中,$title是输入字符串 &$fallback_title是默认值,如果$title输出为空。在此处阅读更多内容:Wordpress 函数参考/清理标题

于 2012-07-10T17:24:27.303 回答
0

这是我使用的功能。

function text_as_url($str='', $separator = 'dash', $lowercase = false){
    if ($separator == 'dash'){
        $search     = '_';
        $replace    = '-';
    } else {
        $search     = '-';
        $replace    = '_';
    }

    $trans = array(
                    '\/'                    => '-',
                    '&\#\d+?;'              => '-',
                    '&\S+?;'                => '-',
                    '\s+'                   => $replace,
                    '[^a-z0-9\-\._]'        => '', // accents
                    $replace.'+'            => $replace,
                    $replace.'$'            => $replace,
                    '^'.$replace            => $replace,
                    '\.+$'                  => '-'
                );

    $str = strip_tags($str);

    foreach ($trans as $key => $val){
        $str = preg_replace("#".$key."#i", $val, $str);
    }

    if($lowercase === true){
        $str = strtolower($str);
    }

    return trim(stripslashes($str));
}
于 2012-07-10T17:25:26.593 回答