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

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

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

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

Ответ 1

Если вы ищете пробел, это будет " " (одно пространство).

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

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

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

Если вы знаете, что используете один из более современных двигателей с регулярными выражениями, "\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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

EDIT. Модифицировать это как регулярное выражение в примере на Perl

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

ИЗМЕНИТЬ СНОВА Основываясь на том, что вы хотите:

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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