0

URL のスラッグを作成しようとしています。

次のテスト文字列があります。

$kw='Test-Tes-Te-T-Schönheit-Test';

この文字列から 3 文字未満の小さな単語を削除したいと考えています。

だから、私は出力が

$kw='test-tes-schönheit-test';

私はこのコードを試しました:

$kw = strtolower($kw);
$kw = preg_replace("/\b[^-]{1,2}\b/", "-",  $kw);
$kw = preg_replace('/-+/', '-', $kw);
$kw = trim($kw, '-');
echo $kw;

しかし、結果は次のとおりです。

test-tes-sch-nheit-test

そのため、ドイツ語の文字 ö は文字列から削除され、ドイツ語の Schönheit は 2 つの単語として扱われます。

これを解決する方法を提案してください。

どうもありがとうございました。

4

2 に答える 2

2

あなたの文字列はUTF-8ではないと思います。ウムラウト/非ASCII文字と正規表現を使用すると、最初にUTF-8にエンコードし、次に-u-modifier(unicode)で正規表現を適用した後-元のエンコードが必要な場合は、再度デコードします(ローカルによる) 。したがって、次のように開始します。

$kw = utf8_encode(strtolower($kw));

これで、regex-unicode機能を使用できます。\ p {L}は文字用、\p{N}は数字用です。すべての文字と数字を(あなたまでの)単語文字と見なすと、境界は反対になります。

[^\p{L}\p{N}]

すべての単語文字が必要です:

[\p{L}\p{N}]

前に開始^または境界がある場合は、その単語が必要です。そのために前向きな後読みを使用できます。

(?<=[^\p{L}\p{N}]|^)

最大2つの「単語文字」の後に境界または末尾を置き換えます。

[\p{L}\p{N}]{1,2}([^\p{L}\p{N}]|$)

したがって、正規表現は次のようになります。

'/(?<=[^\p{L}\p{N}]|^)[\p{L}\p{N}]{1,2}([^\p{L}\p{N}]|$)/u'

必要に応じて、ローカルにデコードします。

echo utf8_decode($kw);

幸運を!ロバート

于 2012-11-30T10:58:02.920 に答える
1

英数字ではないため、\b単語の境界が を超えています。öデフォルトでは、PCRE は ASCII 文字で動作します。

入力文字列は UTF-8/Latin-1 です。他の英語以外の文字記号をそのように扱うには、/uUnicode修飾子を使用します:

$kw = preg_replace("/\b[^-]{1,2}\b/u", "-",  $kw);

preg_replace_callbackまたはところで使用/eし、代わりに置換を検索し[A-Z]ます。そしてstrtr、ダッシュまたは[-+]+連続したものを折りたたむためだけに。

于 2012-11-30T05:45:05.960 に答える