6

我有一堆数据库记录(没有 auto_increment ID 或其他类似的东西)呈现为一个列表,而且我需要用唯一的id.

我可以在循环中添加一个正在运行的计数器并完成它,但不幸的是,这个 ID 需要在整个站点中是可交叉引用的,但是列表是有序或过滤的。

因此,我想到了将记录标题作为一部分包含在内id(带有前缀,因此它不会与布局元素发生冲突)。

如何id以万无一失的方式将字符串转换为名称,使其永远不会包含会破坏 HTML 或不能用作有效 CSS 选择器的字符?

例如;

Title ==> prefix_title
TPS Report 2010 ==> prefix_tps_report_2010
Mike's "Proposal" ==> prefix_mikes_proposal
#53: Míguèl ==> prefix_53_miguel

标题总是足够多样化以避免冲突,并且永远不会包含任何非西方角色。

谢谢!

4

3 回答 3

7

我需要一个类似的 Deeplink Anchors 解决方案。

发现这很有用:

function seoUrl($string) {
    //Lower case everything
    $string = strtolower($string);
    //Make alphanumeric (removes all other characters)
    $string = preg_replace("/[^a-z0-9_\s-]/", "", $string);
    //Clean up multiple dashes or whitespaces
    $string = preg_replace("/[\s-]+/", " ", $string);
    //Convert whitespaces and underscore to dash
    $string = preg_replace("/[\s_]/", "-", $string);
    return $string;
}

信用:https ://stackoverflow.com/a/11330527/3010027

PS:Wordpress-用户看这里:https ://codex.wordpress.org/Function_Reference/sanitize_title

于 2014-05-07T12:14:58.613 回答
0

您根本不需要使用 HTMLid属性。您可以使用HTML5 data-* 属性来存储用户定义的值。这是一个例子:

<ul class="my-awesome-list">
    <!-- PHP code, begin a for/while loop on rows -->
    <li data-rowtitle="<?php echo json_encode($row["title"]); ?>">
        <?php echo $row["title"]; ?>
    </li>
    <!-- PHP loop end -->
</ul>

然后,在您的 jQuery 代码中,您可以使用该$.fn.data方法访问 data-* 值

$(".my-awesome-list li").each(function(){
     var realTitle = $(this).data('rowtitle');
});
于 2012-05-16T13:33:10.667 回答
0

查看W3 规范,ids 和 classes 可以包含:

只有字符 [a-zA-Z0-9] (...) 加上连字符 (-) 和下划线 (_);它们不能以数字或连字符后跟数字开头

请注意,接受其他一些字符(为简单起见,我省略了)。所以我用这个:

// We must be careful not to replace into an invalid string,
// thus adding 'a' in some cases and doing a second replace.
string.replace(/(^-\d-|^\d|^-\d|^--)/,'a$1').replace(/[\W]/g, '-');

请注意,您最终可能会得到最初不同的相同字符串:如果您对此有疑问,则必须依赖更高级的替换功能。

于 2019-03-05T17:13:50.637 回答