Збіг пробілу в регулярному виразі


229

Мені потрібно зіставити пробільний символ у регулярному виразі PHP. Хтось мав якісь ідеї?

Я маю на увазі, як "gavin schulz", пробіл між двома словами. Я використовую регулярний вираз, щоб переконатися, що я дозволяю лише літери, цифру та пробіл. Але я не впевнений, як знайти простір. Це я зараз маю:

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

2
Гм ... також немає сумнівів щодо відповідності "a" чи "b" ...;)

1
ви повинні побачити приклади регулярних
виразів

Відповіді:


368

Якщо ви шукаєте пробіл, це буде " "(один пробіл).

Якщо ви шукаєте одну або декілька, це " *"(це два пробіли і зірочка) або " +"(один пробіл і плюс).

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

Вони працюватимуть у кожному * 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

Його оригінальний вираз, здавалося, хотів замінити "" характер. Ви заперечуєте пробіл, тому його простір не буде "видалено" за призначенням.
Суруот

Цитуючи: "дозволяти лише літери, цифри та пробіл", оригінальний RE Гевіна був помилковим (саме тому він задав питання). Мій RE видаляє все, що не є одним із таких.
paxdiablo

Чому пробіл повинен бути в кінці шаблону відповідності замість, скажімо, посередині?
warren

1
@warren, це не так. Коментар "простір тут" не вказував, куди простір пішов, скоріше він заявив, що там є простір (на випадок, коли читач цього не зрозуміє).
paxdiablo

@Mike, ні, це не так. Наміром тут є заміна всіх символів, яких немає в наборі 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|$)

EDIT Модифікуючи це як регулярний вираз на прикладі Perl

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

РЕДАКТУЙТЕ ПРОТИ На основі того, що ви хочете:

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

1

Я намагаюсь [[: space:]] у випадку, коли схоже, що блогери в WordPress використовують нестандартні символи простору. Схоже, це спрацює.


1

Використовуйте його так, щоб забезпечити єдиний простір.

$newtag = preg_replace("/[^a-zA-Z0-9\s]/", "", $tag)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.