3

特定の文字列の正規表現を作成しようとしています。

目標: 「ラテン語」、「小文字ギリシャ語」、または「数字」以外のすべての文字を削除します。

これまでに行ったこと: [^a-z0-9]
これはラテン文字に最適です。

私がこれを試してみると:[^a-z0-9α-ω]運が悪い。動作しますが、!!#$%@%#$@,` のような他の記号は除外されます

正規表現に関しては、私の知識は限られています。どんな助けでも大歓迎です!

編集:
以下は、指定された文字に一致し、区切り文字としてダッシュを使用してスラッグを作成する関数です。

        $q_separator = preg_quote('-');
        $trans = array(
            '&.+?;'                 => '',
            '[^a-z0-9 -]'           => '',
            '\s+'                   => $separator,
            '('.$q_separator.')+'   => $separator
        );

        $str = strip_tags($str);

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

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

        return trim($str, '-');  

したがって、文字列が次の場合: OnCE on a tIME !#% @$$ in MEXIco
関数を使用すると、出力は次のようになります: once-upon-a-time-in-mexico

これは問題なく動作しますが、preg_match でギリシャ文字も除外する必要があります。

4

2 に答える 2

7

わかりました、これはあなたの機能を置き換えることができますか?

$subject = 'OnCEΨΩ é-+@àupon</span> aαθ tIME !#%@$ in MEXIco in the year 1874 <or 1875';

function format($str, $excludeRE = '/[^a-z0-9]+/u', $separator = '-') {
    $str = strip_tags($str);
    $str = strtolower($str);
    $str = preg_replace($excludeRE, $separator, $str);
    $str = trim($str, $separator);
    return $str;
}
echo format($subject);

<を満たすまで、(strip_tags の原因)以降のすべての文字が失われることに注意してください。>


// ギリシャ文字を保持したいと言ったときの古い回答

α~ωや変なキャラも自由に組める!パターンが機能しない理由は、ユニコード文字列を扱っていることを正規表現エンジンに通知していないためです。uそのためには、パターンの最後に修飾子を追加する必要があります。そのように:

/[^a-z0-9α-ω]+/u

chars 16 進コードも使用できます。

/[^a-z0-9\x{3B1}-\x{3C9}]+/u 

文字列に大文字のギリシャ文字を使用したくない、または保持したくない場合は、次の\p{Greek}ような文字クラスを使用できます。

/[^a-z0-9\p{Greek}]+/u

(少し長いですが、より明確です)

于 2013-04-17T20:04:23.037 に答える
2

There's already an answered question about this:

Remove Non English Characters PHP

You can't specify a range such as α-ω but you need to use their code e.g. \00-\255

于 2013-04-17T16:00:10.827 に答える