2013-04-02 4 views
1

Я пытаюсь проверить формат британских почтовых индексов, используя регулярное выражение здесь: UK Postcode Regex (Comprehensive)PHP preg_match неизвестный модификатор

Мой тест PHP код заключается в следующем, с $ кодом почтовый индекс, чтобы проверить

$regex = '(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX‌​]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))\s?[0-9][A-Z-[C‌​IKMOV]]{2})'; 
echo preg_match($regex,strtoupper($code)); 

Я получаю эту ошибку: Message: preg_match() [function.preg-match]: Unknown modifier '|'

Я не думаю, что проблема с регулярным выражением - это было подтверждено как ответ, и там было довольно много трафика, поэтому я считаю, что это должно было работать для других людей.

Вы видите, что я делаю неправильно? Я не эксперт по регулярному выражению, поэтому я борюсь. Вопрос в Regex to validate UK Post Codes очень похож, но, реализуя решение (добавив^в начале и $ в конце), я получаю новую ошибку «Без конечного разделителя»^«найдено» ...

+0

Да, это в основном тот же вопрос - я не видел его при поиске, так как первые другие подобные вопросы не решить мой случай. – Anak

ответ

3

Я считаю, что ваше регулярное выражение образец должен быть заключен в /.../, так:

$regex = '/(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX‌​]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))\s?[0-9][A-Z-[C‌​IKMOV]]{2})/'; 
+0

Да, это было так - я думаю, что другие ответы, которые я видел, не были на PHP, возможно, у них были разные оболочки. – Anak

2

PHP требует delimiters вокруг регулярных выражений в стиле Perl. После того, как разделители приходят с modifiers. Выберите символ, который вы не используете в регулярном выражении. Наиболее распространенным является /.

$regex = '/(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX‌​]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))\s?[0-9][A-Z-[C‌​IKMOV]]{2})/'; 

Это объясняет сообщение об ошибке, которое вы видите. Он считает, что регулярное выражение равно (GIR 0AA) с круглыми скобками в качестве разделителей, а затем пытается проанализировать | в качестве модификатора.

1

Вы должны использовать разделители в выражениях preg_.

Например:

$regex = '#(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX‌​]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))\s?[0-9][A-Z-[C‌​IKMOV]]{2})#'; 
     ^here                                         and here^
1

пытаются поставить бары в самого начало и конец выражения как: /expression/

$regex = "/(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX‌​]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))\s?[0-9][A-Z-[C‌​IKMOV]]{2})/" 

если и хотят, чтобы выражение быть не чувствительны к регистру, положить a i (от «нечувствительного») после концевой панели. /expression/i

$regex = "/(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX‌​]][0-9][A-HJKSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))\s?[0-9][A-Z-[C‌​IKMOV]]{2})/i"