0

私は正規表現に少し慣れていないので、助けていただければ幸いです。現在のプロジェクトでは、一部のユーザー入力をサニタイズし、短縮された英国の郡名を冗長な対応する名前に変換する必要があります (たとえば、Lincs => Lincolnshire)。

省略形が文字列の先頭にあるか、コンマまたは空白が前にあり、その後に空白が続く場合にのみ置換を行いたいため、正規表現を使用してこれを処理する関数を作成しました (または文字列終了)。

したがって、 の例を考えるとLincs、次の置換が発生するはずです。

Boston, Lincs=> Boston, Lincolnshire(Lincs空白が前にあるため)
Lincs=> Lincolnshire(Lincs文字列の先頭にあるため)
Test, Lincsto=>他の文字が後に続くため)Test, LincstoLincs

現在の関数は次のようになります。

function fullCounties()
{
    $replacements = array(
        'lincs' => 'Lincolnshire'
    );

    $new = $_REQUEST['place'];
    foreach($replacements as $find => $replace)
    {
        $new = preg_replace('/(^|\W)'.$find.'([\W\d])/', $replace, $new);
    }
    echo $new;
}

しかし、これ Boston, Lincsは期待される ではなく、単純に を返しますBoston, Lincolnshire。上記の要件に一致する正しい正規表現を説明したり、これが機能しない理由を提案したりできますか?

4

2 に答える 2

1

省略形が文字列の先頭にあるか、コンマまたは空白が前にあり、その後に空白 (または文字列の終端) が続く場合にのみ、置換を行いたいと考えています。

ルックアラウンド正規表現でこのコードを使用します。

$new = preg_replace('/(?<=^|[,\s])'. preg_quote($find) . '(?=\s|$)/', $replace, $new);
于 2013-11-01T15:04:29.260 に答える
1

Lincsこれは、 を使用して検索しているためです。lincs大文字と小文字を区別しないフラグがないと、これは失敗します。また、Word Boundaries ( ) を調べることもできます\b

$new = preg_replace("(\b".preg_quote($find)."\b)i",$replace,$new);
于 2013-11-01T15:04:34.150 に答える