PHP Regex sınıfı içindeki köşeli ayraç nasıl kullanılır?

5 Cevap php

Ben eklemek [ve] benim doğrulama Regex zaten tüm sayısal kabul ettiğini, çizgi, dönem ve alfanümerik karakter istiyveyaum.

Here is the regex wveyaking: $regex = "^[._a-zA-Z0-9-]*$";

Ama ne zaman deneyin:

$regex = "^[.\\[\\]_a-zA-Z0-9-]*$";

veya

$regex = "^[.\[\]_a-zA-Z0-9-]*$";

It doesn't wveyak (I have read to double escape in PHP fveya bracket but it doesn't wveyak!

Ben kullanmak eregi.

Herhangi bir fikir?

Testi:

<?php
//$regex = "^[_a-zA-Z0-9-]*$";
$regex = "^[.\\[\\]_a-zA-Z0-9-]*$";
echo("1".(eregi($regex, "patrick")?"True":"False"));//Should return True
echo("<br>");
echo("2".(eregi($regex, "p@trick")?"True":"False"));
echo("<br>");
echo("3".(eregi($regex, "pat rick")?"True":"False"));
echo("<br>");
echo("4".(eregi($regex, "patr'ick")?"True":"False"));
echo("<br>");
echo("5".(eregi($regex, "pAtr'ick")?"True":"False"));
echo("<br>");
echo("6".(eregi($regex, "pAtr_ick")?"True":"False"));//Should return True
echo("<br>");
echo("7".(eregi($regex, "pA-tr_ick")?"True":"False"));//Should return True
echo("<br>");
echo("8".(eregi($regex, "pAaAta   atrack")?"True":"False"));
echo("<br>");
echo("9".(eregi($regex, "pA%k")?"True":"False"));
echo("<br>");
echo("10".(eregi($regex, "patrick.second")?"True":"False")); //Should return True
echo("<br>");
echo("11".(eregi($regex, "[Pat]Rick")?"True":"False"));//Should return True
echo("<br>");
?>

5 Cevap

Eski bir çalışması gerekir. Düzenli ifade kaçmak için bir ve dize kaçış için bir: iki ters eğik çizgi kullanmak gerekir. Sadece değerlendirildi nasıl olur bakın:

echo "^[.\\[\\]_a-zA-Z0-9-]*$"; // => ^[.\[\]_a-zA-Z0-9-]*$

Ve bu tam olarak neye ihtiyacınız var.


Edit preg_match kullanın yerine:

preg_match("/^[.\\[\\]_a-zA-Z0-9-]*$/i", $str)

Bu düzenli ifade eregi ile çalışmıyor neden bilmiyorum, ama preg_match ile yapar. Ayıca POSIX ERE functions kalktı ve lehine PHP 6 tarafından silinecektir PCRE functions. PCRE düzenli ifadeler delimiters düzenli ifadeyi kapamak ve modifiers ayırmak için kullandığını unutmayın.

Bunu çift tırnak içinde ise $ kaçmak gerekir.

Örn.:

$regex = "^[.\\[\\]_a-zA-Z0-9-]*\$";

Pek değil bir cevap, ama yararlı bir ipucu: (onlar php ayrıştırma gerektirir yoksa) size kaçan fazladan bir katman yapmak zorunda değilsiniz, böylece regexes tek tırnak kullanın. Sadece bir tek tırnak tek tırnaklı dize kaçan gerektirir. (php strings)

Ayrıca, fonksiyonların ereg ailesidir on its way out. Neden birlikte, preg_match kullanmak değil bir 'i' bir harf duyarsız eşleşme için kapanış bölü sonra?

ereg fonksiyonlarını kullanırken parantez ifadelerinde karakterleri kaçmıyor. Yerine bu deseni kullanın:

$regex = "^[]._[a-zA-Z0-9-]*$";

O regex man page braket ifadeler bölümünü okuyarak çalışır neden anlayabiliyorum.

Her neyse, eregi şimdi PHP 5.3 önerilmiyor gibi sadece, bunun yerine PCRE functions geçmek için daha iyi olurdu.

Escaping inside brackets does not work with ereg (it treats \ as literal char). ']' should always be placed as first char in brackets and '[' can be anywhere else:

$regex = "^[]._[a-zA-Z0-9-]*$";

Ereg PHP 5.3 önerilmiyor ve PHP6 kaldırılacaktır Ancak daha iyi, preg_match'in göç.