0

このような文字列が欲しいです:

基本的には a-zA-Z の文字列であり、à または è または ì または ù で終わることができる (またはできない) ものです。

これは私がしました:

preg_match('/^[a-zA-Z]+[a-zA-Z]+$|^[a-zA-Z]+[àèìòù]?$/', $word)

私はまだ大丈夫だと思いますが、何らかの理由でそれは仕事をしません!

編集: àèìòù で終わるイタリア語の姓がいくつかありますが、文字で終わるものもあります。文字列の末尾が àèìòù または文字で終わるようにしたいと考えています。

これは完全なコードです

if ( preg_match('/^[a-zA-Z]+[àèìòù]?$/', $word) ) {
    echo "0";

} else {
    echo LASTNAME_ERROR;
}

しかし、それを実行すると、LASTNAME_ERROR が返されました

4

3 に答える 3

1

あなたの説明によると、次のように正規表現を定式化します。

/^[a-zA-Z]+[àèìòù]?$/

ただし、あなたの質問からは、問題が正確にどこにあるかは明確ではありません。あなたの正規表現は少し冗長に見えますが、問題を説明するほど不完全ではありません(少なくとも私にはそうではありません)。

編集:あなたの質問を読み直した後、私は一つのことを見ました:変数$wordにはUTF-8でエンコードされたデータが含まれている可能性があります。その場合は、正規表現にu(PCRE_UTF8)修飾子を追加する必要があります。

/^[a-zA-Z]+[àèìòù]?$/u
                     ^
                     `--- UTF-8 modifier

これは逆の場合にも当てはまります。アプリケーションでまだ UTF-8 を使用していないが、PHP ファイルが UTF-8 でエンコードされている場合、上記の正規表現も有効ではありません。

文字列と PHP ファイルの両方の文字エンコーディングを確認してください。

于 2013-03-13T11:11:29.553 に答える
0

さて、正規表現のいくつかを確認して、どこが間違っていたかを確認しましょう。

/^[a-zA-Z]+[a-zA-Z]

したがって、1つ以上のa-zA-Zの後にa-zA-Zが続きます。まあ、それは本当にかなり無意味です: /^[a-zA-Z]+十分でしょう。

^[a-zA-Z]+[àèìòù]?$/

したがって、a-zA-Zを1回以上実行し、その後に1つ以上のシンボルを続けます。さて、それはあなたの元の正規表現に非常に似ているので、切り取って元に戻しましょう。

/^[a-zA-Z]+[àèìòù]?$/

したがって、a-zA-Zが1回以上あり、その後に記号が続き、文字列の最後に0回以上あります。ちなみに、ハクレは最初にこの答えを考案しました。私はあなたの間違いのいくつかを説明したかっただけです。

于 2013-03-13T11:17:22.627 に答える
0

これはうまくいくはずです

/((?!\(à|è|ì|ò|ù)$)[a-zA-Z])+/

(            # start a group for the purposes of repeating
 (à|è|ì|ò|ù) # negative lookahead assertion for the pattern à|è|ì|ò|ù
 [a-zA-Z]    # your own pattern for matching a URL character
)+           # repeat the group
于 2013-03-13T11:17:44.437 に答える