2012-04-02 4 views
-1

Мне нужно проверить в php, что строка не должна начинаться или заканчиваться дефисом (-). Разрешенные символы: a-z, A-Z, 0-9 и дефис в любом месте середины строки.Regex для проверки первого и последнего символов

Мое это регулярное выражение

/^[a-zA-Z0-9-]+$/ 

Проверяется наличие разрешенного характера ожидать условие, что строка не должна начинаться или заканчиваться дефисом. Как мне это достичь? Я новичок в регулярном выражении.

+0

'/^[a-zA-Z0-9 _] (. *) [a-zA-Z0-9 _] $ /' Грубый подход. – hjpotter92

+0

У вас есть символ подчеркивания в вашем примере, но вы не говорите, что это разрешено? – MichaelRushton

+0

@MichaelRushton: Моя ошибка! Обновлено регулярное выражение. – Rahul

ответ

4

Это должно быть то, что вам нужно.

/^[a-z0-9]+([a-z0-9-]+[a-z0-9])?$/iD 

Обратите внимание, что модификатор D. Без него выражение будет соответствовать строке, которая заканчивается новой строкой. См. Здесь: http://blog.5ubliminal.com/posts/surprises-of-php-regexp-the-d-modifier/. Кроме того, я использовал модификатор i, чтобы не использовать [a-zA-Z0-9]. Сохраняет выражение короче.

Вот несколько примеров. Поскольку входная строка заканчивается символом новой строки, она должна потерпеть неудачу, но без модификатора D, даже с $ якоря, она проходит:

// Outputs: int(1) 
var_dump(preg_match('/^[a-z0-9]+([a-z0-9-]+[a-z0-9])?$/i', "aBc-d\n")); 

// Outputs: int(0) 
var_dump(preg_match('/^[a-z0-9]+([a-z0-9-]+[a-z0-9])?$/iD', "aBc-d\n")); 
+0

Thumbs up для этого модификатора D! – Rahul

1

Попробуйте это:

/^[a-zA-Z0-9_]+[a-zA-Z0-9_-]*[a-zA-Z0-9_]+$/ 

«Один или один ничего, кроме дефиса, то любое число чего-либо, включая дефис, то один или более ничего, кроме дефиса».

EDIT: Это не удастся, если строка имеет один символ. Извини за это. Но вы получаете идею ... Разделите ее на субрежим.

+0

Отлично! Это работает именно так, как должно! Благодаря! – Rahul

+0

Ну, моя строка состоит из 3 символов минимум, так что это не проблема :) – Rahul

+0

@Rahul вы можете взглянуть на http://meta.stackexchange.com/questions/5234/how-does-accepting -an-answer-work :) –

0

Используйте метод substr. что-то вроде:

if ((substr($str, 0, 1) != '-') && (substr($str, strlen($str)) != '-')){ 

Он может также имеет функцию, аналогичную charAt в JavaScript, но я не помню сейчас. (Это даст вам более читаемый код)

+0

Как насчет специальных символов в середине строки? приведенный выше фрагмент просто позаботится о том, чтобы первый и последний персонажи не были дефисом. – Rahul

+0

@Rahul Ну, у вас уже есть регулярное выражение для этого, так что просто объедините буксир таким образом, который имеет смысл для вас. –

1

Проверяет, что допустимый символ ожидает условия, что строка не должна начинаться или заканчиваться дефисом. Как мне это достичь? Я новичок в регулярном выражении.

Проще говоря: ~^[^-][a-z0-9-]+[^-]$~ должен соответствовать. Он говорит, что первый символ не может быть -, тогда он говорит, что средняя часть может содержать только [a-z0-9-], а затем говорит, что последний символ не может быть «-». Тем не менее, вы также можете сделать это с помощью substr, я не думаю, что вам действительно нужно регулярное выражение.

С подстрокой:

<?php 
$valid = ((substr($str, 0, 1) != '-') && (substr($str, -1) != '-')); 

EDIT: Не читать буквенно-цифровые символы плюс дефис части, включил его в регулярном выражении.

+0

вы забыли про a-z0-9 внутри –

+0

@ArtjomKurapov Да, я только что заметил, обновил ответ;) –

+0

Как насчет специальных символов в середине строки? приведенный выше фрагмент просто позаботится о том, чтобы первый и последний персонажи не были дефисом. – Rahul

4

Использование отрицательной look ahead and look behind для достижения этой цели

^(?!-)[a-zA-Z0-9-]+(?<!-)$ 

Посмотри here on Regexr

^(?!-) негативный взгляд вперед утверждение, гарантирует, что она не начинается с тире

(?<!-)$ негативный взгляд за утверждением, гарантирует, что он не заканчивается штрих-кодом

Преимущество поисковых запросов заключается в том, что они не соответствуют символу, а просто определяют утверждение, это означает, что ваша строка также может иметь длину 1, где решение, явно требующее не тире в качестве первого и последнего символов, составляет мин. длина 2.

КПП.a-zA-Z0-9_ предопределенный класс \w так что если вы хотите, чтобы подчеркивание вы можете изменить:

^(?!-)[\w-]+(?<!-)$ 
+0

Теперь это умное решение! – Rahul

0

Это не регулярное выражение в-се, но работает по к вашим требованиям:

if(
    ctype_alnum($str[0]) && 
    ctype_alnum($str[strlen($str)-1]) && 
    strpos(substr($str, 1, strlen($str-1)), '-') !== false 
) { 
    echo 'a match'; 
} 
+0

Регулярное выражение было бы приятным :) Но спасибо за ваши усилия ... – Rahul