次のような文字列を取ることができる単純な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
あなたは1つでそれを行うことができますpreg_replace
:
preg_replace(array("/[A-Z]/e", "/\\p{P}/", "/\\s+/"),
array('strtolower("$0")', '', '-'), $str);
技術的には、1つの正規表現でそれを行うことができますが、これはより簡単です。
プリエンプティブ応答:はい、それは不必要に正規表現(非常に単純なものですが)、不必要に多数のへの呼び出しを使用しstrtolower
、英語以外の文字を考慮しません(彼はエンコーディングさえ与えません)。OPの要件を満たしているだけです。
多くのフレームワークがこのための機能を提供しています
CodeIgniter: http://bitbucket.org/ellislab/codeigniter/src/c39315f13a76/system/helpers/url_helper.php#cl-472
wordpress (コードにはさらに多くのものがあります): http://core.trac.wordpress.org/browser/trunk/wp-includes/formatting.php#L814
正規表現が人生のすべての問題に対する普遍的な万能薬と見なされるのはなぜですか (preg_match の低いバックトレースが癌の治療法を発見したからです)。正規表現に頼らない解決策は次のとおりです。
$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;
与える
topic-some-stuff-maybe-some-more-its-my-iñtërnâtiônàlizætión-stuff