#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);