правильное регулярное выражение для поддомена

#php #regex #subdomain

#php #регулярное выражение #поддомен

Вопрос:

У меня есть веб-приложение, где люди регистрируются и получают поддомен под этим доменом приложения ( xx.app.com ) … для каждого поддомена существует база данных, которая присоединена к нему грамматически и имеет то же имя, что и поддомен.

что мне нужно, так это правильное регулярное выражение, которое работает с поддоменом, и, конечно, имя базы данных (mysql, если это имеет значение), оно должно быть в нижнем регистре и длиной от 6 до 20, и единственным разрешенным символом является «-«, также запрещены числа…

я пытался много раз, но всегда получалось плохо, .. некоторые вроде: /([a-z-]){6,20}/

Заранее спасибо 🙂

Комментарии:

1. Можете ли вы также показать свой PHP-код и в каком контексте вы его пробовали? Потому что само регулярное выражение выглядит пригодным для использования.

2. я думаю, что лучший способ — это регулярное выражение в htaccess, вы хотите код htaacess?

3. Смотрите мой ответ о том, как сделать его не «совпадающим» с числами

4. Разрешение - вызовет у вас проблемы с именем базы данных 😉

5. @Tomalek: Вы не сможете использовать имя без обратной ссылки на него ( `db-name` вместо просто db_name ). Это действительно проблема в кодировании и запрещено многими стандартами кодирования.

Ответ №1:

Для этого может быть правильное регулярное выражение, но регулярное выражение для этого не подходит.

Попробуйте parse_url

Редактировать:

Я не уверен, как вы его используете. Если вы обрабатываете только часть поддомена, следующее должно работать и не соответствовать числам:

 ^[a-z-]{6,20}$
  

Это гарантирует, что в поддомене есть только от a до z и — и от 6 до 20 раз. Символ ^ соответствует началу строки, а $ — концу.

Причина, по которой предыдущее регулярное выражение также принимало числа или что-либо еще, заключалась в том, что само совпадение было бы частью строки. Теперь с помощью ^ и $ вы гарантируете, что это целая строка.

Комментарии:

1. почему, я хочу сначала проверить выбранное имя,

2. с помощью parse_url не удается получить поддомен! оно возвращает только имя хоста, например для : xxx.domain.com , возвращает host : xxx.domain.com

3. нет необходимости экранировать тире / дефис в этом месте в классе character, но вы можете , если действительно хотите 😉

4. @mousio — правильно! Просто пришел к выводу, что unescaped — вот почему это не работало. Я обновил регулярное выражение, которое должно работать для него, основываясь на его комментарии о том, что оно принимает числа

Ответ №2:

Это было бы более безопасным регулярным выражением, поскольку поддомен не может начинаться с дефиса:

 ^[a-z][a-z-]{5,19}$
  

Что касается имени базы данных, я считаю, что оно не может содержать дефис, поскольку это оператор вычитания, поэтому вашим лучшим выбором может быть либо запретить дефисы, либо заменить их подчеркиванием:

 $database = str_replace('-', '_', $subdomain);
  

РЕДАКТИРОВАТЬ: По-видимому, @nikic прав, вы можете использовать дефисы, если возвращаете название базы данных.

Ответ №3:

Вы пробовали избегать дефиса?

 /([a-z-]){6,20}/
  

Комментарии:

1. @Ahmed: Если это ваша проблема, то вам просто нужно ^ в начале регулярного выражения.

Ответ №4:

Для этого вам понадобится регулярное выражение с положительным прогнозом. Попробуйте следующий код:

 <?php
   $a = array("xx-yyy.domain.cam", "xx4yyy.domain.cam", "abcde.domain.com", "my-sub-domain.domain.org");
   foreach ($a as $v) {
      echo "For domain $v: ";
      preg_match('/^(?:[-a-z]{6,20})(?=.)/', $v, $m );
      if (count($m) > 0)
         echo( "subdomain: " . $m[0] . "n");
      else
         echo "subdomain not matchedn";
   }
?>
  

В основном подбирайте комбинацию строчных букв и - символа дефиса длиной от 6 до 20 символов перед появлением первой точки . .

- дефис необязательно экранировать, если он используется в начале в квадратных скобках.

ВЫВОД

 For domain xx-yyy.domain.cam: subdomain: xx-yyy
For domain xx4yyy.domain.cam: subdomain not matched
For domain abcde.domain.com: subdomain not matched
For domain my-sub-domain.domain.org: subdomain: my-sub-domain
  

Комментарии:

1. О, это тоже работает :), я должен начать изучать некоторые регулярные выражения

2. @Ahmed, возможно, я что-то упускаю, но другой ответ, который вы приняли, не работает для извлечения поддомена из полного доменного имени, например: preg_match('/^[a-z][a-z-]{5,19}$/', "foo.example.com", $m ); var_dump($m);