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


229

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

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

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

2
Хм ... также не возникает вопросов о соответствии 'a' или 'b' ...;)

Ответы:


368

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

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

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

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

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

Его оригинальное регулярное выражение, казалось, хотело заменить "" персонажа. Вы отрицаете пробел, поэтому его пробел не будет "удален", как задумано.
Suroot

Цитируя: «разрешать только буквы, цифры и пробел», исходное RE Гэвина было неверным (именно поэтому он задавал вопрос). Мой RE удаляет все, что не является одним из них.
paxdiablo

Почему пробел должен быть в конце шаблона совпадения, а не, скажем, посередине?
Уоррен

1
@ Warren, это не так. Комментарий «пространство здесь» не указывал, куда делось пространство, скорее, он указывал, что там есть место (на случай, если читатель не осознает).
paxdiablo

@ Майк, нет, дело не в этом. Целью здесь является замена всех символов, которые не входят в набор A-Za-z.... Каретка внутри квадратных скобок диктует это. Перемещение каретки за пределы квадратных скобок меняет его значение на совпадающие символы в наборе в начале строки.
paxdiablo


34

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

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

5

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



4

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

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

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

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

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


3

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

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

РЕДАКТИРОВАТЬ Изменение этого, чтобы быть регулярным выражением в примере Perl

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

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

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

1

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.