簡體   English   中英

php / regex:“linkify”博客標題

[英]php/regex: “linkify” blog titles

我正在嘗試編寫一個簡單的PHP函數,可以使用類似的字符串

Topic: Some stuff, Maybe some more, it's my stuff?

並返回

topic-some-stuff-maybe-some-more-its-my-stuff

因此:

  • 小寫
  • 刪除所有非字母數字非空格字符
  • 用連字符替換所有空格(或空格組)

我可以用一個正則表達式做到這一點嗎?

function Slug($string)
{
    return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', html_entity_decode(preg_replace('~&([a-z]{1,2})(?:acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8')), ENT_QUOTES, 'UTF-8')), '-'));
}

$topic = 'Iñtërnâtiônàlizætiøn';
echo Slug($topic); // internationalizaetion

$topic = 'Topic: Some stuff, Maybe some more, it\'s my stuff?';
echo Slug($topic); // topic-some-stuff-maybe-some-more-it-s-my-stuff

$topic = 'here عربي‎ Arabi';
echo Slug($topic); // here-arabi

$topic = 'here 日本語 Japanese';
echo Slug($topic); // here-japanese

為什么正則表達式被認為是解決所有生命問題的普遍靈丹妙葯(僅僅因為preg_match中的低回溯已經發現了治愈癌症的方法)。 這是一個無需借助regexp的解決方案:

$str = "Topic: Some stuff, Maybe some more, it's my stuff?";
$str = implode('-',str_word_count(strtolower($str),2));
echo $str;

沒有走完整個UTF-8路線:

$str = "Topic: Some stuff, Maybe some more, it's my Iñtërnâtiônàlizætiøn stuff?";
$str = implode('-',str_word_count(strtolower(str_replace("'","",$str)),2,'Þßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ'));
echo $str;

話題有些-東西 - 也許,一些-更其-MY-iñtërnâtiônàlizætiøn-東西

你可以用一個preg_replace做到這一點:

preg_replace(array("/[A-Z]/e", "/\\p{P}/", "/\\s+/"),
    array('strtolower("$0")', '', '-'), $str);

從技術上講,你可以使用一個正則表達式,但這更簡單。

搶先響應:是的,它不必要地使用正則表達式(雖然非常簡單),對strtolower的調用次數非常大,並且它不考慮非英語字符(他甚至不提供編碼); 我只是滿足了OP的要求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM