Сопоставление пробела в регулярном выражении

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

Я имею в виду, как "Гэвин Шульц", пространство между двумя словами. Я использую регулярное выражение, чтобы убедиться, что я разрешаю только буквы, числа и пробелы. Но я не знаю, как найти это место. Это то, что у меня есть сейчас:

$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);

9 ответов


если вы ищете место, что бы " " (один пробел).

если вы ищете один или несколько, это " *" (это два пробелы и звездочка) или " +" (один пробел и плюс).

если вы ищете общий интервал, используйте "[ X]" или "[ X][ X]*" или "[ X]+" здесь X является физическим символом вкладки (и каждому из них предшествует одно пространство во всех этих примерах).

они будут работать в * regex engine я когда-либо видел (некоторые из которых даже не имеют одного или более "+" персонаж, тьфу).

если вы знаете, что будете использовать один из более современных движков regex, "\s" и его вариации-это путь. Кроме того, я считаю, что границы слов совпадают с началом и концом строк, что важно, когда вы ищете слова, которые могут появиться без предшествующих или следующих пробелов.

для PHP конкретно,этот страница может помочь.

из вашего редактирования, похоже, вы хотите удалить все недействительные символы начало этого (обратите внимание на пробел внутри регулярного выражения):

$newtag = preg_replace ("/[^a-zA-Z0-9 ]/", "", $tag);
#                                    ^ space here

если вы также хотите, чтобы обман гарантировал, что есть только одно пространство между каждым словом и ни в начале, ни в конце, это немного сложнее (и, вероятно, еще один вопрос), но основная идея будет:

$newtag = preg_replace ("/ +/", " ", $tag); # convert all multispaces to space
$newtag = preg_replace ("/^ /", "", $tag);  # remove space from start
$newtag = preg_replace ("/ $/", "", $tag);  # and end

0 совпадает с пробелом.

Regexp PHP reference

Новая Ссылка
Escape-последовательности для Regex PHP


Мне кажется, что использование регулярного выражения в этом случае будет просто излишним. Почему бы просто не strpos найти пробела. Кроме того, нет ничего особенного в символе пробела в регулярных выражениях, вы должны иметь возможность искать его так же, как и любой другой символ. То есть, если вы не отключили пробелы шаблона, что вряд ли было бы необходимо в этом случае.


в Perl переключатель \s (пробел).


вы также можете использовать \b для границы слова. Для имени я бы использовал что-то вроде этого:

[^\b]+\b[^\b]+(\b|$)

редактировать изменение этого, чтобы быть регулярным выражением в Примере Perl

if( $fullname =~ /([^\b]+)\b[^\b]+([^\b]+)(\b|$)/ ) {
 $first_name = ;
 $last_name = ;
}

РЕДАКТИРОВАТЬ СНОВА на основе того, что вы хотите:

$new_tag = preg_replace("/[\s\t]/","",$tag);

я использую регулярное выражение, чтобы убедиться, что я разрешить только буквы, цифры и Пробел

тогда это так же просто, как добавить пробел к тому, что у вас уже есть:

$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);

(обратите внимание, я убрал s|, который, казалось, непреднамеренно? Конечно s был избыточным; вы можете восстановить | Если вам это нужно)

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


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

  • [[:blank:]] пробел или вкладка только
  • [[:space:]] пробел
  • \s любой символ пробела
  • \v вертикальный пробел
  • \h горизонтальные пробельные символы
  • x игнорировать пробельные символы

Я пробую [[: space:]] в случае, когда похоже, что блоггеры в WordPress используют нестандартные символы пробела. Похоже, это сработает.


используйте его так, чтобы разрешить одно пространство.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)