Мне нужно сопоставить символ пробела в регулярном выражении PHP. У кого-нибудь есть идеи?
Я имею в виду «gavin schulz», пространство между двумя словами. Я использую регулярное выражение, чтобы убедиться, что я допускаю только буквы, цифры и пробелы. Но я не уверен, как найти место. Это то, что я имею прямо сейчас:
$newtag = preg_replace("/[^a-zA-Z0-9s|]/", "", $tag);
Если вы ищете место, это будет " "
(одно пространство).
Если вы ищете один или несколько, это " *"
(это два пробела и звездочка) или " +"
(одно место и плюс).
Если вы ищете общий интервал, используйте "[ 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
\040
совпадает с символом пробела.
Ссылка PHP Regexp
Мне кажется, что использование REGEX в этом случае просто будет излишним. Почему бы просто просто strpos не найти символ пространства. Кроме того, нет ничего особенного в символе пробела в регулярных выражениях, вы должны иметь возможность искать его так же, как и искать другого персонажа. То есть, если вы не отключили пробел шаблона, что вряд ли понадобилось бы в этом случае.
Вы также можете использовать \ 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);
Я использую регулярное выражение, чтобы убедиться, что я допускаю только буквы, цифры и пробел
Тогда это так же просто, как добавить пространство к тому, что у вас уже есть:
$newtag = preg_replace("/[^a-zA-Z0-9 ]/", "", $tag);
(Заметьте, я удалил s|
который казался непреднамеренным? Конечно, s
был избыточным, вы можете восстановить |
если вам это нужно)
Если вы специально хотите * * * пространство, как в одном только, вам потребуется более сложное выражение, чем это, и может потребоваться рассмотреть отдельную логическую часть, не относящуюся к регулярному выражению.
В Perl переключатель имеет значение \s
(пробел).
Я пытаюсь выполнить [[: space:]] в экземпляре, где похоже, что блоггеры в WordPress используют нестандартные символы пробела. Похоже, это сработает.