sözcüklerin bir dizi oluşumunu bulmak

2 Cevap php

Ben böyle bir desen değişken set takma olarak kullanmak yasadışı kelimelerin küçük bir liste ile bir desen var:

$pattern = webmaster|admin|webadmin|sysadmin

preg_match, nasıl bu sözlerle takma yasak böylece elde edebilirsiniz kullanılması, ancak "admin2" ya da benzeri bir şey kaydediliyor "thesysadmin" izin verilir?

Bu şimdiye kadar sahip ifadesidir:

preg_match('/^['.$pattern.']/i','admin');

/ / Izin verilmemelidir

Not: \b çok yardımcı olmadı kullanma.

2 Cevap

What about not using regex at all ?
And working with explode and in_array ?

Örneğin, bu yapardı:

$pattern = 'webmaster|admin|webadmin|sysadmin';
$forbidden_words = explode('|', $pattern);

Ayırıcı olarak | Bu kullanarak, bir diziye desen patlar.


And this :

$word = 'admin';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

alırsınız

admin is not OK

Oysa bu (same code ; only the word changes):

$word = 'admin2';
if (in_array($word, $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

alırsınız

admin2 is OK

Bu şekilde, tam sözcükleri maç için, doğru regex bulma konusunda endişelenmenize gerek yok: sadece tam sözcükleri olacak ;-)


Edit : one problem might be that the comparison will be case-sensitive :-(
Working with everything in lowercase will help with that :

$pattern = strtolower('webmaster|admin|webadmin|sysadmin');  // just to be sure ;-)
$forbidden_words = explode('|', $pattern);

$word = 'aDMin';
if (in_array(strtolower($word), $forbidden_words)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

Alacak:

aDMin is not OK

(I saw the 'i 'sadece benim cevap yazdıktan sonra regex bayrağı; yani, ) düzenlemek zorunda


Eğer gerçekten bir regex ile yapmak istiyorsanız Edit 2 : ve, bunu bilmeniz gerekir:

  • ^ dize başlangıcıdır
  • ve $ dizenin sonunu

Yani, böyle bir şey yapmanız gerekir:

$pattern = 'webmaster|admin|webadmin|sysadmin';

$word = 'admin';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

$word = 'admin2';
if (preg_match('#^(' . $pattern . ')$#i', $word)) {
    echo "<p>$word is not OK</p>";
} else {
    echo "<p>$word is OK</p>";
}

Parentheses are probably not necessary, but I like using them, to isolate what I wanted.

Ve, çıkış aynı tür alırsınız:

admin is not OK

admin2 is OK

Muhtemelen [ ve ] kullanmak istemiyorum: Onlar "her birimiz arasında karakter" değil, "bizim aramızda bütün dize" anlamına gelir.

Ve, referans olarak: preg syntax manuel ;-)

Yani, yasak kelimeler part kendi username ama her şey değil olabilir?

. NET'te, desen olurdu:

 Allowed = Not RegEx.Match("admin", "^(webmaster|admin|webadmin|sysadmin)$")

"^" Dizesi başlangıcıyla eşleşir, "$" karşılaşmaları sona erdi, bu yüzden bu kelimelerin biri üzerinde tam bir eşleşme arıyor. Ben gelen PHP sözdizimi biraz bulanık.